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