First of all, thank you again for the technology of the network, Daniel shared the course.
A. Traditional mode of the ListView adapter: 1. Create a ListView and create the item layout for the ListView 2. Encapsulating Data 3. Create a specific adapter for the item layout for data presentation. (In this process, if there are too many controls in a ListView item, the life and invocation of the control will cause the code to rise, and if there are many places in an app that need to be used in a ListView, writing multiple adapters separately can lead to many repetitive operations, In order to avoid this situation, make coding easier, you can refer to Mu-class network Android Universal adapter writing. )。
The traditional adapter coding style is as follows:
Package com.imooc.imooc_adapter;import java.util.list;import android.content.context;import android.view.layoutinflater;import android.view.view;import android.view.viewgroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAdapter extends baseadapter { private context context; private list<bean> mlist; public myadapter (Context context, list<bean> mlist) { super (); this.context = context; this.mlist = mlist; } public list<bean> getmlist () { return mlist; &nbsP; } public void setmlist (list<bean> mlist) { this.mlist = mlist; } @Override public int getcount () { return mlist.size (); } @Override public object getitem (int arg0) { return mlist.get (arg0); } @Override public long getitemid (int arg0) { return arg0; } @Override public view getview (int position, view convertview, viewgroup parent) { viewholer holder =null; if (convertview ==null) { holder = new viewholer (); convertview = (Layoutinflater) context .getsystemservice (Context.LAYOUT_INFLATER_ SERVICE)) .inflate (R.layout.item, parent,false); holder.name= (TextView) convertview.findviewbyid (r.id.name); holder.phone = (TextView) Convertview.findviewbyid (R.ID.PHone); convertview.settag (holder); }else{ convertview.settag (Holder); } final bean bean = mlist.get (position); holder.name.settext (Bean.getusername ()); holder.phone.settext (Bean.getphone ()); return convertView; } class ViewHoler{ textview name; textview phone; } }
The universal adapter code is as follows:
Package com.imooc.imooc_adapter; Import java.util.List; Import Android.content.Context; Import Com.imooc.util.commonadapter;import Com.imooc.util.ViewHolder; public class Newadapter extends commonadapter<bean>{public newadapter (context context, list<bean> Mdatas, int layoutid) {Super (context, mdatas,layoutid); } @Override public void convert (Viewholder holder, bean Bean) {holder.settext (R.id.phone, Bean.getphone ()). s Ettext (R.id.name, Bean.getusername ()); } }
This shows that the universal adapter can be reduced the amount of code.
The universal adapter encapsulates user-defined Viewholder and Baseadapter declarations, and calls Commonadapter and Viewholer two classes.
Universal Adapter Authoring Logic:
1. Package Viewholder, free the view Convertview, implement a code to complete the instantiation of the Convertview:
Viewholder holder = Viewholder.get (Mcontext, Convertview, parent, postion, LayoutID);
Implementation method:
public class viewholder { private sparsearray<view> Mviews; private context mcontext; private view mConvertView; private int mposition; Public view getmconvertview () { return Mconvertview; } public int getmposition () { return mposition; } public viewholder (context context, viewgroup Parent, int layoutid, int position) { this.mposition = position; &nbsP; this.mviews = new sparsearray<view> (); mconvertview = layoutinflater.from (context). Inflate (layoutid, parent, false); mconvertview.settag (This); } Public static viewholder get (context context, view convertview, viewgroup parent, int position, int layoutid) { if (convertview == null) { return new viewholder (context, parent, layoutid, position); } else { viewholder holder = (ViewHolder) convertview.gettag (); holder.mposition = position; return holder; } } public <t extends view> t getview (int &NBSP;VIEWID) { view view = mviews.get ( Viewid); if (view == null) { view = mconvertview.findviewbyid (Viewid) ; mviews.put (Viewid, view); } return (T) view; }
The use of Sparearray here is similar to the:list<int,object> form of storage, to compare hashmap<int,object> to save time and improve efficiency.
To create an abstract class Commonadapter:
public abstract class commonadapter<t> extends baseadapter { protected Context mcontext; protected List<T> Mdatas; protected layoutinflater minlater; private int layoutid; public commonadapter (context context ,list<t > datas,int layoutid) { this.mcontext = context; this.mDatas= datas; this.layoutId = layoutId; Minlater = layoutinflater.from (context); } public context getmcontext () { &nbSp; return mcontext; } public void setmcontext (Context mcontext) { this.mcontext = mcontext; } public List<T> getmdatas () { return mDatas; } public void setmdatas (List<t> mdatas) { this.mDatas = mDatas; } @Override public int getcount () { return mdatas.size (); } @Override public t getitem (int arg0) { &nbSp; return mdatas.get (arg0); } @Override public long getitemid (int arg0) { return arg0; } @Override public view getview (Int postion, view convertview, viewgroup parent) { viewholder holder = Viewholder.get (Mcontext, convertview, parent, postion, layoutid); convert (Holder, getitem (postion)); return holder.getmconvertview (); }; public Abstract void convert (viewholder holder,t t);}
Open the Convert method to the developer for a simple assignment operation.
Inherit the Commonadapter in the custom adapter:
public class Newadapter extends commonadapter<bean>{public newadapter (context context, list<bean> Mdatas, int layoutid) {Super (context, mdatas,layoutid); } @Override public void convert (Viewholder holder, bean Bean) {holder.settext (R.id.phone, Bean.getphone ()). s Ettext (R.id.name, Bean.getusername ()); }}
When you initialize a custom adapter in mainactivity, you can use:
adapter= New Newadapter (Getapplicationcontext (), Mlist,r.layout.item);
Where you can encapsulate the operation of the control in the Viewholder package class (depending on your individual needs) adapter
Public Viewholder setText (int viewId, String text) {TextView TV = GetView (viewId); Tv.settext (text); return this; }public viewholder setimageresource (int viewid,int resId) {ImageView img= getView (viewId); Img.setimageresource (RESID); return this; }
MU Class Network Universal Adapter Learning Notes