databind替代viewholder

本文介绍如何使用DataBinding技术替代传统ViewHolder模式,通过实例演示DataBinding在Adapter中的应用,简化代码并提高开发效率。

有所了解的都知道databinding出现的意义就在于系统自动帮助我们生成Data和View之间的connection.而在Adapter中出现的ViewHolder就是我们手动生成的connection,下面我们就来看看databinding是如何完全取代ViewHolder的角色吧。(在此之前请看如何配置环境,在上述链接里有)

  

  1. public class DynamicActivity extends Activity {
       private View.OnClickListener itemClickListener;
       private GridView gridView;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_dynamic);
           itemClickListener = new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   Toast.makeText(getBaseContext(), v.getClass().getSimpleName(), Toast.LENGTH_SHORT).show();
               }
           };
           gridView = (GridView) findViewById(R.id.gridView);
           MMyAdapter adapter = new MMyAdapter(getBaseContext());
           adapter.setOnclickListener(itemClickListener);
           gridView.setAdapter(adapter);
       }
    }

 


         listener用于处理item的一些click事件,当然也可以直接写到adapter里面去,但是考虑到adapter还是比较纯粹的处理view和data的关系,所以把这个还是放到了activity层。

        接着是activity_main.xml文件比较简单就一个gridview


  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       
    android:layout_width="match_parent"
       
    android:layout_height="match_parent">
       <GridView
           
    android:id="@+id/gridView"
           
    android:layout_width="match_parent"
           
    android:layout_height="wrap_content"
           
    android:numColumns="3" />
    </RelativeLayout>


   接着是比较关键的adapter


  1. /**
    * Created by zhangxiaang on 15/7/6.
    */
    public class MMyAdapter extends BaseAdapter {
       private Context mContext;
       private LayoutInflater inflater;
       private List<String> mlist;
       public View.OnClickListener itemClickListener;
       private ItemmBinding binding;

       public MMyAdapter(Context context) {
           this.mContext = context;
           inflater = LayoutInflater.from(context);
           mlist = new ArrayList<String>();
           for (int i = 0; i < 100; i++) {
               mlist.add(i, "item" + i);
           }
       }
       @Override
       public int getCount() {
           return mlist == null ? 0 : mlist.size();
       }

       @Override
       public Object getItem(int position) {
           return mlist.get(position);
       }

       @Override
       public long getItemId(int position) {
           return position;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
           if (convertView == null) {
               binding = DataBindingUtil.inflate(inflater, R.layout.itemm, parent, false);
               convertView = binding.getRoot();
               convertView.setTag(binding);
           } else {
               binding = (ItemmBinding) convertView.getTag();
           }
           binding.setVariable(BR.item, mlist.get(position));
           binding.setAdapter(this);
           return convertView;
       }
       public void setOnclickListener(View.OnClickListener itemClickListener) {
           this.itemClickListener = itemClickListener;
       }
    }

其中的item布局如下:


  1. <layout xmlns:android="http://schemas.android.com/apk/res/android"
       
    xmlns:app="http://schemas.android.com/apk/res-auto">

       <data>
           <variable
               
    name="item"
               
    type="String" />
           <variable
               
    name="adapter"
               
    type="com.liangfeizc.databindingsamples.dynamic.MMyAdapter" />
       </data>

       <LinearLayout
           
    android:layout_width="match_parent"
           
    android:layout_height="match_parent"
           
    android:orientation="vertical">

           <TextView
               
    android:id="@+id/textView"
               
    android:layout_width="wrap_content"
               
    android:layout_height="wrap_content"
               
    android:clickable="true"
               
    app:text="@{item}"
               
    app:onClickListener="@{adapter.itemClickListener}"/>
       </LinearLayout>
    </layout>


可以看到的是在adapter中完全没有 viewHolder的身影,在getView中,开始直接判断当前的convertview是否为空,进而来初始化这个binding对象,而convertView就是这个binding对象所对应的container的root view类似一个view-tree的rootView角色,然后同样的给当前convertView打一个标签方便后续取出,如果不为空的话就直接取出当前convertView的binding对象。

处理完convertView的视图部分接着就是处理convertView的数据部分,而数据部分应该在包含在convertview的binding中进行赋值。(感兴趣的可以去看看生成的binding代码,自动的替我们生成了<variable>标签里面数据的setter函数)

 

最后把设置完了view和data的converView直接返回就ok 啦,大家跑一边看看databinding带来的便利吧。

 

Ps:由于在rufi的案例中已经给了一个recyclerView的案例,但是我个人觉得recyclerView中已经封装了ViewHolder,所以再使用databinding的话就显得有点多余了。毕竟databinding的存在意义就是取代掉viewHolder的。

 

欢迎各位提出自己的一些想法或者实现过程中遇到的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值