Adapter 超简洁写法

作者: 玩儿出彩 | 来源:发表于2016-05-31 19:46 被阅读555次

EasyListView

每次用到 ListView 时候都需要写一个Adapter;令人恶心的是需要在getView() 方法中添加一堆代码,无论是维护还是从头开始写都非常不便。该项目能够极大的简化代码,使得代码更加模块化,且只需要三步就可以实现一个 Adapter。
GitHub : https://github.com/jqzhang/EasyListView

实现思路:

  1. 根据不同的 viewType 创建 View
  2. 绑定(项目中用Buttetknife 实现)
  3. 更新View

主要代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) { 
  ViewHolder vh;   
  // 如果view为null 或者 类型不符则重新创建
  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. 实现 Adapter

     class SingleTypeAdapter extends EasyBaseAdapter {
         List<Result> list = new ArrayList<>();
    
         @Override
         protected List getList() {
             if (list.size() > 0) {
                 return list;
             }
             // 构造数据
             for (int i = 0; i < 60; i++) {
                 SingleTypeActivity.Result result = new SingleTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         // 构造 Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             // 创建 ItemView
             View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null);
             return new SingleTypeViewHolder(view);
         }
     }
    
  2. 实现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. 实现Adapter
    class MutiTypeAdapter<Result> extends EasyBaseAdapter {

         // 一定要实现该方法
         @Override
         public int getViewTypeCount() {
             return 2;
         }
    
         // 一定要实现该方法
         @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;
             }
             // 构造数据
             for (int i = 0; i < 60; i++) {
                 MutiTypeActivity.Result result = new MutiTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         // 构造 Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             // 根据 ViewType 创建 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. 实现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 中一定要实现 getViewTypeCount() 和 getItemViewType()这两个方法。其余照搬就好。

相关文章

  • Adapter 超简洁写法

    EasyListView 每次用到 ListView 时候都需要写一个Adapter;令人恶心的是需要在getVi...

  • ListView的用法

    -主界面布局: -adapter布局: -adapter,java写法: -主界面写法: -adapter,kot...

  • RecyclerView的用法

    -主界面布局: -adapter布局: -adapter,java写法 -主界面代码: -adapter,kotl...

  • ViewHolder模式超简洁写法

    先声明,从国外网站上看的,不是自己原创的,但确实很喜欢这个简洁的设计。ViewHolder这么写(只提供一个静态方...

  • vuex 简洁写法

    在src下新建一个 /store/index.js,内容如下 在main.js里面引用 这样就可以在vue里面使用了:

  • 简洁的Bash Programming技巧(二)

    简洁的Bash Programming技巧(二) 1. 检查命令执行是否成功 第一种写法,比较常见: 简洁的写法:...

  • switch结构采用对象形式重写

    原因 switch结构不利于代码重用 对象属性写法更加简洁 例子 swith写法 对象属性写法

  • 分别用Kotlin和java写RecyclerView

    java:跟一般的写法一样,增加了按钮响应MainActivity: Adapter: RecyclerItem:...

  • this.$emit简洁写法

    子组件 this.emit('update:idx',index)(传递过来的最新值)父组件 实际意思就是把i...

  • if-else简洁写法

    赋值 一行表达式 列表比较大小(隐含的if(True)else(False)) 参考:https://www.cn...

网友评论

    本文标题:Adapter 超简洁写法

    本文链接:https://www.haomeiwen.com/subject/uxthdttx.html