Android Databinding ÔÚadapterÖÐÍêȫȡ´úViewHolderʵ¼ù

ÕÅϺ°º / ÎÄ ·¢±íÓÚ2015-07-09 09:26 µÚ´ÎÔĶÁ adapter,Android Databinding

          ÔÚÎÄÕµĿªÊ¼¸Ð[email protected] ¶ÔÎҵİïÖú£¬»ý¼«½â´ðÎÒµÄһЩÒÉÎÊ¡£´ó¼ÒÈç¹û¶ÔÓÚ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´úÂ룬×Ô¶¯µÄÌæÎÒÃÇÉú³ÉÁË<variable>±êÇ©ÀïÃæÊý¾ÝµÄsetterº¯Êý£©

 

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

 

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

 

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