Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> BaseRecyclerAdapter之添加不同布局(優化篇)

BaseRecyclerAdapter之添加不同布局(優化篇)

編輯:關於Android編程

由於之前發了篇「BaseRecyclerAdapter之添加不同布局(頭部尾部)」收到了以下反饋,在此非常感謝,寶貴建議!希望加群多多提建議,讓這個項目更加好用,幫助到更多人。

目前已優化:「GitHub源碼地址」

 

效果如何?

優化前:

public class MultipleItemAdapter extends BaseQuickAdapter {
    private final int TEXT_TYPE = 1;
    private int mTextLayoutResId; 
   public MultipleItemAdapter(Context context, List data, int... layoutResId) {
        super(context, layoutResId[0], data);
        mTextLayoutResId = layoutResId[1];
    }
    @Override
    protected int getDefItemViewType(int position) {
        if (position % 2 == 0)
            return TEXT_TYPE;
        return super.getDefItemViewType(position);
   } 
   @Override
    protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TEXT_TYPE)
            return new TextViewHolder(getItemView(mTextLayoutResId, parent));
        return super.onCreateDefViewHolder(parent, viewType);
    }
    @Override
    protected void onBindDefViewHolder(BaseViewHolder holder, String item) {
        if (holder instanceof TextViewHolder)
            holder.setText(R.id.tv, item); 
   }
    @Override
    protected void convert(BaseViewHolder helper, String item) {
        helper.setImageUrl(R.id.iv, item);
    }
    public class TextViewHolder extends BaseViewHolder {
        public TextViewHolder(View itemView) {
            super(itemView.getContext(), itemView);
        }
    }
}

優化後(瘦身二分之一):

public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter {
    public MultipleItemQuickAdapter(Context context, List data) {
        super(context, data);
        addItmeType(MultipleItem.TEXT, R.layout.text_view);
        addItmeType(MultipleItem.IMG, R.layout.image_view);
    }
    @Override
    protected void convert(BaseViewHolder helper, MultipleItem item) {
        switch (helper.getItemViewType()) {
            case MultipleItem.TEXT:
                helper.setImageUrl(R.id.tv, item.getContent());
                break;
            case MultipleItem.IMG:
                helper.setImageUrl(R.id.iv, item.getContent());
                break;
        }
    }
}

原理分析

由於上篇說了寫多個不同類型的布局一定會用到getItemViewTypeonCreateViewHolder方法,但是在優化後的代碼中沒看到,怎麼做的到呢?
優化前:getDefItemViewType

protected int getDefItemViewType(int position) {
         if (position % 2 == 0) return TEXT_TYPE; 
         return super.getDefItemViewType(position);
 }

優化後不用寫:getDefItemViewType,看看基類的處理

@Overrideprotected int getDefItemViewType(int position) {
    return mData.get(position).getItemType();
}

原理分析:在填充數據的時候就把view type給添加進去了。


優化前:onCreateDefViewHolder

@Override
protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TEXT_TYPE)
        return new TextViewHolder(getItemView(mTextLayoutResId, parent));
        return super.onCreateDefViewHolder(parent, viewType);
}

優化後不用寫:onCreateDefViewHolder,看看基類的處理

private SparseArray layouts;
protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
    int layoutId = getLayoutId(viewType);
    View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
    return new BaseViewHolder(mContext, view);
}
private int getLayoutId(int viewType) { return layouts.get(viewType);}
protected void addItmeType(int type, int layoutResId) {
    if (layouts == null) {
        layouts = new SparseArray<>();
    }
    layouts.put(type, layoutResId);
}

原理分析:addItmeType以type為鍵以layoutResId為值存儲到的SparseArray裡面,在onCreateDefViewHolder根據viewType來獲取相應的layoutResId。

 

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