編輯:關於Android編程
在Android開發中,對於AdapterView類型的控件,我們都需要通過適配器來給它設置數據,如果顯示的內容比較簡單,我們通常使用SimpleAdapter或者ArrayAdapter,而對於復雜多變的數據,我們一般使用自定義一個繼承自BaseAdapter的Adapter來處理。為了itemview的復用,我們通常用一個Viewholder來包裝itemview裡面的控件。
在我的安卓架構中,使用BaseAbsListAdapter作為所有AbsListView的適配器的基類:
/**
* BaseAbsListAdapter是所有AbsListView的適配器的基類
* Created by naivor on 16-4-12.
*/
public abstract class BaseAbsListAdapter> extends BaseAdapter {
protected Context context;
protected LayoutInflater inflater;
protected List itemDatas;
private VH viewHolder;
public BaseAbsListAdapter(Context context, LayoutInflater inflater) {
this.context = context;
this.inflater = inflater;
itemDatas = new ArrayList<>();
}
@Override
public int getCount() {
return itemDatas.size();
}
@Override
public T getItem(int position) {
if (position list) {
if (list != null) {
itemDatas.addAll(list);
notifyDataSetChanged();
}
}
/**
* 替換數據
*
* @param originItem
* @param newItem
*/
public void replaceItem(T originItem, T newItem) {
if (itemDatas.contains(originItem)) {
int position = itemDatas.indexOf(originItem);
itemDatas.remove(position);
itemDatas.add(position, newItem);
notifyDataSetChanged();
}
}
/**
* 添加數據
*/
public void addItems(int position, List list) {
if (list != null) {
itemDatas.addAll(position, list);
notifyDataSetChanged();
}
}
/**
* 添加單個數據
*/
public void addItem(T item) {
if (item != null) {
itemDatas.add(item);
notifyDataSetChanged();
}
}
/**
* 添加單個數據
*/
public void addItem(int position, T item) {
if (item != null && position >= 0) {
itemDatas.add(position, item);
notifyDataSetChanged();
}
}
/**
* 刪除數據
*/
public void removeItem(int position) {
if (position >= 0 && position < getCount()) {
itemDatas.remove(position);
notifyDataSetChanged();
}
}
/**
* 刪除數據
*/
public void removeItem(T data) {
if (data != null && itemDatas.contains(data)) {
itemDatas.remove(data);
notifyDataSetChanged();
}
}
/**
* 設置新數據,原來的清空
*/
public void setItems(List list) {
if (list != null) {
itemDatas.clear();
itemDatas.addAll(list);
notifyDataSetChanged();
}
}
/**
* 清空
*/
public void clearItems() {
if (!isEmpty()) {
itemDatas.clear();
notifyDataSetChanged();
}
}
public List getDatas() {
return itemDatas;
}
}
BaseAbsListAdapter主要包含了一些對數據的操作,比如添加一條或多條數據,移除一條或多條數據,替換一條數據,清空數據等等。。。。。
而BaseViewHolder則是所有ViewHolder的基類:
/**
* BaseViewHolder是所有ViewHolder的基類
* Created by naivor on 16-4-12.
*/
public abstract class BaseViewHolder {
protected Context context;
protected BaseAbsListAdapter absListAdapter;
protected View convertView;
protected int position;
protected T data;
public BaseViewHolder(View convertView,BaseAbsListAdapter absListAdapter) {
this.convertView = convertView;
context=convertView.getContext();
this.absListAdapter=absListAdapter;
}
public View getConvertView() {
return convertView;
}
/**
* 將ItemData加載到ItemView上面,在實際的Viewholder中,需要重寫此方法
*
* @param position
* @param data
* @return
*/
public void loadDataToView(int position, T data){
this.position=position;
this.data=data;
}
/**
* 查找控件
*
* @param viewId
* @return
*/
public View find(int viewId) {
return convertView.findViewById(viewId);
}
/**
* itemview子控件的點擊事件的監聽器
*
*/
public static interface OnInnerViewClickListener {
public void onClick(View view, T itemData, int postition);
}
}
BaseViewHolder則主要負責將itemData的數據加載到itemView上面,同時還可以通過實現View.OnClickListener,處理itemview內部的控件的點擊事件。
更多資料:
我的github地址以及使用demo: https://github.com/naivor/naivorapp
vivo x7怎麼截圖?vivo x7手機是剛剛發布出來的新機,可能有用戶還不會截屏,下文介紹vivo x7截屏圖文流程,一起來瞧瞧吧! vivo x7截
ListFragment繼承於Fragment。因此它具有Fragment的特性,能夠作為activity中的一部分,目的也是為了使頁面設計更加靈活。相比Fragment
android手機內存本來就不大,要是老把數據放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把數據要放到SD卡中,以減少手機內存的使用,本文僅寫入文件
需求是在我按下按鈕時,該變按鈕顏色,使用戶感覺到自己按了按鈕,當松開的時候,變回原來的顏色。正常時:按下時:有人說,直接監聽按鈕的按下事件不得了嘛,其實這樣確實能實現同樣