Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓開發 第七篇 我的安卓應用架構設計-----Adapter類及ViewHolder類

安卓開發 第七篇 我的安卓應用架構設計-----Adapter類及ViewHolder類

編輯:關於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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved