Simplified Adapter writing and findViewById () method optimization, adapterview
First write a ViewHolder:
Public class ViewHolder {private View mConvertView; private Activity mActivity; private SparseArray <View> mViewArray; // SparseArray public ViewHolder (View convertView) referenced by View {this. mConvertView = convertView;} public ViewHolder (Activity activity) {this. mActivity = activity;} public <T extends View> T get (int viewId) {// obtain View if (mActivity = null) through ViewId) {// ViewHolder SparseArray <View> viewHolder = (SparseArray <View>) mConvertView of ListAdapter. getTag (); if (viewHolder = null) {viewHolder = new SparseArray <View> (); mConvertView. setTag (viewHolder);} View childView = viewHolder. get (viewId); if (childView = null) {childView = mConvertView. findViewById (viewId); viewHolder. put (viewId, childView);} return (T) childView;} else {// ViewHolder if (mViewArray = null) of the Activity) {mViewArray = new SparseArray <View> ();} View childView = mViewArray. get (viewId); if (childView = null) {childView = mActivity. findViewById (viewId); mViewArray. put (viewId, childView);} return (T) childView ;}} public void setText (int viewId, String text) {// set Text (TextView) through ViewId) get (viewId )). setText (text);} public void setText (int viewId, Spanned text) {// set Text (TextView) get (ViewId) through viewId )). setText (text);} public void setTextColor (int viewId, int color) {// set TextColor (TextView) get (ViewId) through viewId )). setTextColor (color);} public void setImageResource (int viewId, int resId) {// set the image (ImageView) get (ViewId) by viewId )). setImageResource (resId);} public void setImageBitmap (int viewId, Bitmap bm) {// set the image (ImageView) get (ViewId) through viewId )). setImageBitmap (bm);} public void setImageDrawable (int viewId, Drawable drawable) {// set the image (ImageView) get (ViewId) through viewId )). setImageDrawable (drawable);} public void setImageUrl (int id, String url) {// sets the network image through ViewId // Rosemary. loadImage (url, (ImageView) get (id);} public void setImageUrl (int id, String url, int resId) {// sets the network image through ViewId // Rosemary. loadImage (url, (ImageView) get (id), resId);} public void setVisibility (int viewId, int visibility) {// hide and display get (ViewId) through viewId settings ). setVisibility (visibility);} public void setOnClickListener (int viewId, View. onClickListener l) {// click to listen to get (ViewId) through viewId settings ). setOnClickListener (l );}}
Then write a BaseActivity:
public class BaseActivity extends ActionBarActivity { protected ViewHolder mHolder; public <T> T $(int viewID) { return (T) mHolder.get(viewID); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BaseApplication.getInstance().addActivity(this); mHolder = new ViewHolder(this); }}
Encapsulate a simple Adapter:
Public abstract class ListAdapter <T> extends BaseAdapter {protected Context mContext; protected LayoutInflater mInflater; protected List <T> mList; // dataset protected int mLayoutID; // layout resource ID protected ListAdapter () {} public ListAdapter (Context ctx, List <T> list, int layoutID) {mContext = ctx; mInflater = LayoutInflater. from (ctx); mList = list; mLayoutID = layoutID;} @ Override public int getCount () {If (mList! = Null & mList. size ()> 0) return mList. size (); return 0 ;}@ Override public T getItem (int position) {if (mList! = Null & mList. size ()> 0) return mList. get (position); return null ;}@ Override public long getItemId (int position) {return position ;}@ Override public View getView (int position, View convertView, ViewGroup parent) {if (convertView = null) convertView = mInflater. inflate (mLayoutID, null); ViewHolder holder = new ViewHolder (convertView); onBind (position, getItem (position), holder); return convertView ;} /***** bind data */protected abstract void onBind (int position, T item, ViewHolder holder );}
Effect:
Public class BlacklistActivity extends VolleyActivity implements IInit, detail {private ListView mListView; private BlacklistViewModel mViewModel = new BlacklistViewModel (); private ListAdapter <BlacklistViewModel> mAdapter; @ Override protected void onCreate (Bundle entity) {super. onCreate (savedInstanceState); setContentView (R. layout. activity_blacklist); init () ;}@ Override pu Blic void init () {ActionBarUtil. setup (this, "my blacklist"); mListView = $ (R. id. lv_blacklist); fetchData (FIRST) ;}@ Override public void fetchData (int tag) {toggleProgress (true); if (tag = FIRST) {// request blacklist list GetBlackBuyerListParam param = new GetBlackBuyerListParam (mViewModel. getPageIndex (), Data. PAGE_SIZE_LARGE, Data. getUserID (); UserApi. getBlackBuyerList (this, param, tag);} else if (tag = SECOND) {// Remove the blacklist RemoveBlackBuyerParam param = new RemoveBlackBuyerParam (Data. getUserID (), mViewModel. getList (). get (mViewModel. getCurrentPosition ()). getModel (). getBuyerID (); UserApi. removeBlackBuyer (this, param, tag) ;}@ Override public void updateUI (Object response, int tag) {if (response = null) return; if (tag = FIRST) {mViewModel. inflate (response); // blacklist list if (mAdapter = null) {mAdapter = New ListAdapter <BlacklistViewModel> (this, mViewModel. getList (), R. layout. item_blacklist) {@ Override protected void onBind (final int position, final BlacklistViewModel item, ViewHolder holder) {holder. setImageUrl (R. id. iv_avatar, item. getModel (). getHeadImageUrl (), R. drawable. defaultportrait); holder. setOnClickListener (R. id. iv_avatar, new View. onClickListener () {@ Override public void onClick (Vie W v) {IntentUtil. toPersonInfo (BlacklistActivity. this, item. getModel (). getBuyerID () ;}}); holder. setText (R. id. TV _name, item. getModel (). getBuyerName (); holder. setOnClickListener (R. id. btn_remove, new View. onClickListener () {@ Override public void onClick (View v) {mViewModel. setCurrentPosition (position); new AlertDialog. builder (BlacklistActivity. this ). setMessage (String. format ("are you sure you want to remove" % s "from the blacklist? ", Item. getModel (). getBuyerName ())). setPositiveButton (android. r. string. OK, new DialogInterface. onClickListener () {@ Override public void onClick (DialogInterface dialog, int which) {fetchData (SECOND );}}). setNegativeButton (android. r. string. cancel, null ). create (). show () ;}}) ;}}; mListView. setAdapter (mAdapter); mListView. setEmptyView (findViewById (R. id. iv_no_data);} else {mAdapter. notifyDataSet Changed () ;}} else if (tag = SECOND) {if (Boolean) response) {ToastUtil. show (this, "removed successfully! "); MViewModel. getList (). remove (mViewModel. getCurrentPosition (); mAdapter. policydatasetchanged ();}}}}
Summary:
Previously, mListView = (ListView) findViewById (R. id. lv_blacklist) was written );
Now you only need to write mListView =$ (R. id. lv_blacklist );
And the adapter is simplified into several lines of code:
MAdapter = new ListAdapter <BlacklistViewModel> (this, mViewModel. getList (), R. layout. item_blacklist) {@ Override protected void onBind (final int position, final BlacklistViewModel item, ViewHolder holder) {holder. setImageUrl (R. id. iv_avatar, item. getModel (). getHeadImageUrl (), R. drawable. defaultportrait); holder. setOnClickListener (R. id. iv_avatar, new View. onClickListener () {@ Override public void onC Lick (View v) {IntentUtil. toPersonInfo (BlacklistActivity. this, item. getModel (). getBuyerID () ;}}); holder. setText (R. id. TV _name, item. getModel (). getBuyerName (); holder. setOnClickListener (R. id. btn_remove, new View. onClickListener () {@ Override public void onClick (View v) {mViewModel. setCurrentPosition (position); new AlertDialog. builder (BlacklistActivity. this ). setMessage (String. format ("OK to remove" % s "from the blacklist? ", Item. getModel (). getBuyerName ())). setPositiveButton (android. r. string. OK, new DialogInterface. onClickListener () {@ Override public void onClick (DialogInterface dialog, int which) {fetchData (SECOND );}}). setNegativeButton (android. r. string. cancel, null ). create (). show () ;}}) ;}}; mListView. setAdapter (mAdapter );