Adapter 超簡潔寫法

EasyListView

每次用到 ListView 時候都需要寫一個Adapter;令人惡心的是需要在getView() 方法中添加一堆代碼,無論是維護(hù)還是從頭開始寫都非常不便。該項目能夠極大的簡化代碼,使得代碼更加模塊化,且只需要三步就可以實現(xiàn)一個 Adapter。
GitHub : https://github.com/jqzhang/EasyListView

實現(xiàn)思路:

  1. 根據(jù)不同的 viewType 創(chuàng)建 View
  2. 綁定(項目中用Buttetknife 實現(xiàn))
  3. 更新View

主要代碼:

@Override
public View getView(int position, View convertView, ViewGroup parent) { 
  ViewHolder vh;   
  // 如果view為null 或者 類型不符則重新創(chuàng)建
  if (null == convertView || ((convertView.getTag() != null) && (((ViewHolder) convertView.getTag()).getType() != getItemViewType(position))))    {      
    vh = onCreateViewHolder(parent, position);          
    vh.setType(getItemViewType(position));   
  } else {      
    vh = (ViewHolder) convertView.getTag();   
  }   
  if (null == vh) {      
    return null;   
  }   
  vh.updateView(vh.getConvertView(), getItem(position), position);   
  return vh.getConvertView();
}

項目地址

注意:項目中用到 butterknife

單一樣式

  1. 實現(xiàn) Adapter

     class SingleTypeAdapter extends EasyBaseAdapter {
         List<Result> list = new ArrayList<>();
    
         @Override
         protected List getList() {
             if (list.size() > 0) {
                 return list;
             }
             // 構(gòu)造數(shù)據(jù)
             for (int i = 0; i < 60; i++) {
                 SingleTypeActivity.Result result = new SingleTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         // 構(gòu)造 Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             // 創(chuàng)建 ItemView
             View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null);
             return new SingleTypeViewHolder(view);
         }
     }
    
  2. 實現(xiàn)ViewHolder
    class SingleTypeViewHolder extends EasyBaseAdapter.ViewHolder<Result> {

         @Bind(R.id.textView)
         TextView textView;
    
         public SingleTypeViewHolder(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             // 更新View 
             textView.setText(data.txt + position + "  " + (null == convertView));
         }
     }
    
  3. 完成
    listView.setAdapter(new SingleTypeAdapter());

多樣式

  1. 實現(xiàn)Adapter
    class MutiTypeAdapter<Result> extends EasyBaseAdapter {

         // 一定要實現(xiàn)該方法
         @Override
         public int getViewTypeCount() {
             return 2;
         }
    
         // 一定要實現(xiàn)該方法
         @Override
         public int getItemViewType(int position) {
             if (0 == position % 2) {
                 return 0;
             } else {
                 return 1;
             }
         }
    
         List<MutiTypeActivity.Result> list = new ArrayList<>();
    
         @Override
         protected List<MutiTypeActivity.Result> getList() {
    
             if (list.size() > 0) {
                 return list;
             }
             // 構(gòu)造數(shù)據(jù)
             for (int i = 0; i < 60; i++) {
                 MutiTypeActivity.Result result = new MutiTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         // 構(gòu)造 Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             // 根據(jù) ViewType 創(chuàng)建 ItemView
             if (0 == getItemViewType(position)) {
                 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null);
                 return new MutiTypeViewHolder1(view);
             } else {
                 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_2, null);
                 return new MutiTypeViewHolder2(view);
             }
         }
     }
    
  2. 實現(xiàn)ViewHolder
    class MutiTypeViewHolder1 extends EasyBaseAdapter.ViewHolder<Result> {

         @Bind(R.id.textView)
         TextView textView;
    
         public MutiTypeViewHolder1(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             // 更新View 
             textView.setText("刺激 + " + position + "   " + (null == convertView));
         }
     }
    
     class MutiTypeViewHolder2 extends EasyBaseAdapter.ViewHolder<Result> {
    
         @Bind(R.id.imageView)
         ImageView imageView;
    
         public MutiTypeViewHolder2(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             // 更新View 
             imageView.setImageResource(R.mipmap.rr);
           }
     }
    
  3. 完成
    listView.setAdapter(new SingleTypeAdapter());

注意:多樣式ListView 的 Adapter 中一定要實現(xiàn) getViewTypeCount() 和 getItemViewType()這兩個方法。其余照搬就好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容