Android Databinding 在adapter中完全取代ViewHolder实践

          ÔÚÎÄÕµĿªÊ¼¸Ðл@rufi ¶ÔÎҵİïÖú£¬»ý¼«½â´ðÎÒµÄһЩÒÉÎÊ¡£´ó¼ÒÈç¹û¶ÔÓÚdatabinding»¹²»Ì«Á˽âµÄ»°¿ÉÒÔÈ¥ËûµÄgithubÉÏÈ¥Á˽â¸ü¶àµÄdatabindingµÄÓ¦Óá£

          µØÖ·ÈçÏ£º https://github.com/LyndonChin/MasteringAndroidDataBinding   ÅäÖõĻ·¾³ÔÚËûµÄÎÄÕÂÀﶼдµÄ·Ç³£Ïêϸ£¬ÓÐÒÉÎʵĿÉÒÔÖ±½Ó×ÉѯËûÓ´£¬Èç¹ûÊDZȽϼòµ¥µÄÎÊÌâ¾ÍÖ±½ÓÁôÑÔÔÚÎÄÕµÄÏÂÃæ°É£¬ÎÒ»áÒ»Ò»½â´ðµÄ£¨²»¶®ÎÒ¾ÍÈ¥ÎÊËû?£©

          ÓÐËùÁ˽âµÄ¶¼ÖªµÀdatabinding³öÏÖµÄÒâÒå¾ÍÔÚÓÚϵͳ×Ô¶¯°ïÖúÎÒÃÇÉú³ÉDataºÍViewÖ®¼äµÄconnection.¶øÔÚAdapterÖгöÏÖµÄViewHolder¾ÍÊÇÎÒÃÇÊÖ¶¯Éú³ÉµÄconnection£¬ÏÂÃæÎÒÃǾÍÀ´¿´¿´databindingÊÇÈçºÎÍêÈ«È¡´úViewHolderµÄ½ÇÉ«°É¡££¨ÔÚ´Ë֮ǰÇë¿´ÈçºÎÅäÖû·¾³£¬ÔÚÉÏÊöÁ´½ÓÀïÓУ©

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»¹ÊDZȽϴ¿´âµÄ´¦ÀíviewºÍdataµÄ¹Øϵ£¬ËùÒÔ°ÑÕâ¸ö»¹ÊǷŵ½ÁËactivity²ã¡£

        ½Ó×ÅÊÇactivity_main.xmlÎļþ±È½Ï¼òµ¥¾ÍÒ»¸ögridview

<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>

   ½Ó×ÅÊDZȽϹؼüµÄadapter

/**  
 * 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²¼¾ÖÈçÏ£º

<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´úÂ룬×Ô¶¯µÄÌæÎÒÃÇÉú³ÉÁ˱êÇ©ÀïÃæÊý¾ÝµÄsetterº¯Êý£©

×îºó°ÑÉèÖÃÍêÁËviewºÍdataµÄconverViewÖ±½Ó·µ»Ø¾Íok À²£¬´ó¼ÒÅÜÒ»±ß¿´¿´databinding´øÀ´µÄ±ãÀû°É¡£

Ps:ÓÉÓÚÔÚrufiµÄ°¸ÀýÖÐÒѾ­¸øÁËÒ»¸örecyclerViewµÄ°¸Àý£¬µ«ÊÇÎÒ¸öÈ˾õµÃrecyclerViewÖÐÒѾ­·â×°ÁËViewHolder£¬ËùÒÔÔÙʹÓÃdatabindingµÄ»°¾ÍÏÔµÃÓеã¶àÓàÁË¡£±Ï¾¹databindingµÄ´æÔÚÒâÒå¾ÍÊÇÈ¡´úµôviewHolderµÄ¡£

»¶Ó­¸÷λÌá³ö×Ô¼ºµÄһЩÏë·¨»òÕßʵÏÖ¹ý³ÌÖÐÓöµ½µÄÎÊÌâ¡£

来自:Android Data Binding