星空网 > 软件开发 > 操作系统

Android—万能ListView适配器

ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义。

最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家。

首先有一个自定义的Adapter继承于BaseAdapter,下面是自定义的Adapter,精华在getView()方法中

package com.example.mylistview.util;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;public abstract class CommonAdapter<T> extends BaseAdapter {  /**   * 上下文   */  private Context mContext;  /**   * 实体类集合   */  private List<T> mDatas;  private LayoutInflater mInflater;  /**   * 控件id   */  private int mlayoutId;  public CommonAdapter(Context context, List<T> datas, int layoutId) {    this.mContext = context;    this.mDatas = datas;    this.mlayoutId = layoutId;    mInflater = LayoutInflater.from(context);  }  @Override  public int getCount() {    // TODO Auto-generated method stub    return mDatas.size();  }  @Override  public T getItem(int arg0) {    // TODO Auto-generated method stub    return mDatas.get(arg0);  }  @Override  public long getItemId(int arg0) {    // TODO Auto-generated method stub    return arg0;  }  @Override  public View getView(int arg0, View arg1, ViewGroup arg2) {    // TODO Auto-generated method stub    ViewHolder holder = ViewHolder.get(mContext, arg1, arg2, mlayoutId,        arg0);    convert(holder, getItem(arg0));    return holder.getConvertView();  }  public abstract void convert(ViewHolder holder, T t);}

以上的抽象方法convert(ViewHolder holder, T t);就相当于以前通用代码中的

viewHolder.mTextView = (TextView) convertView .findViewById(R.id.id_tv_title);

viewHolder.mTextView.setText(Bean.getName());

找到控件的id再去设施setText等重复的代码方法中的参数ViewHolder holder, T t    holder就相当于以前通用代码中的viewHolder,t就相当于一个自己定义的实体类Bean。

以上代码中getView()方法中有一个ViewHolder是需要自己声明的,以下是代码以及详细注释:

package com.example.mylistview.util;import android.content.Context;import android.graphics.Bitmap;import android.renderscript.Type;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;public class ViewHolder {  /**   * SparseArray类存放View集合   */  private SparseArray<View> mViews;  /**   *   */  private int mPosition;  /**   * 布局文件   */  private View mConvertView;  public View getConvertView() {    return mConvertView;  }  public ViewHolder(Context context, ViewGroup parent, int layoutId,      int position) {    this.mViews = new SparseArray<View>();    this.mPosition = position;    this.mConvertView = LayoutInflater.from(context).inflate(layoutId,        parent, false);    this.mConvertView.setTag(this);  }  /**   * 拿到一个ViewHolder对象   * @param context   * @param convertView   * @param parent   * @param layoutId   * @param position   * @return   */  public static ViewHolder get(Context context, View convertView,      ViewGroup parent, int layoutId, int position) {    if (null == convertView) {      return new ViewHolder(context, parent, layoutId, position);    } else {      ViewHolder holder = (ViewHolder) convertView.getTag();      holder.mPosition = position;      return holder;    }  }  /**   * 通过控件的id获取对应的控件,如果没有则加入views   * @param viewId   * @return   */  public <T extends View> T getView(int viewId) {    View view = mViews.get(viewId);    if (null == view) {      view = mConvertView.findViewById(viewId);      mViews.put(viewId, view);    }    return (T) view;  }  /**   * 为TextView设置字符串   * @param viewId   * @param text   * @return   */  public ViewHolder setText(int viewId, String text) {    TextView tv = getView(viewId);    tv.setText(text);    return this;  }  /**   * 为ImageView设置图片   *    * @param viewId   * @param drawableId   * @return   */   public ViewHolder setImageResource(int viewId, int drawableId)   {     ImageView view = getView(viewId);     view.setImageResource(drawableId);     return this;   }     public int getPosition()   {     return mPosition;   } }

再写一个Adapter继承于万能适配器CommonAdapter,还是要写一个自己的Adapter,因为一个项目可能会有多个ListView,但是每个的item元素,布局都会有所不同的,这个泪用来区分不同的ListView与自己所对应的item.这个代码量较少完全可以写成内部类在Activity.java中.

package com.example.mylistview.adapter;import java.util.List;import android.content.Context;import android.view.View;import android.view.View.OnClickListener;import android.widget.CheckBox;import com.example.mylistview.R;import com.example.mylistview.domain.Bean;import com.example.mylistview.util.CommonAdapter;import com.example.mylistview.util.ViewHolder;public class MyAdapter extends CommonAdapter<Bean> {  public MyAdapter(Context context, List<Bean> datas, int layoutId) {    super(context, datas, layoutId);    // TODO Auto-generated constructor stub  }  @Override  public void convert(ViewHolder holder, final Bean bean) {    // TODO Auto-generated method stub    holder.setText(R.id.tv_title, bean.getTitle())        .setText(R.id.tv_desc, bean.getDesc())        .setText(R.id.tv_time, bean.getTime())        .setText(R.id.tv_phone, bean.getPhone());    /**     * 防止CheckBox混乱     */    final CheckBox cBox = (CheckBox)(holder.getView(R.id.cb));    if (cBox != null)    {      cBox.setChecked(bean.isChecked());      cBox.setOnClickListener(new OnClickListener()      {        @Override        public void onClick(View v)        {          bean.setChecked(cBox.isChecked());        }      });    }  }}

 

优化之后用适配器的时候就简单多了下面是实体类,item和MainActivity.java中的代码:

实体类:

package com.example.mylistview.domain;public class Bean {  private String title;  private String desc;  private String time;  private String phone;  private boolean isChecked;  public boolean isChecked() {    return isChecked;  }  public void setChecked(boolean isChecked) {    this.isChecked = isChecked;  }  /**   * @param title   * @param desc   * @param time   * @param phone   */  public Bean(String title, String desc, String time, String phone) {    this.title = title;    this.desc = desc;    this.time = time;    this.phone = phone;  }  public String getTitle() {    return title;  }  public void setTitle(String title) {    this.title = title;  }  public String getDesc() {    return desc;  }  public void setDesc(String desc) {    this.desc = desc;  }  public String getTime() {    return time;  }  public void setTime(String time) {    this.time = time;  }  public String getPhone() {    return phone;  }  public void setPhone(String phone) {    this.phone = phone;  }}

MainActivity.java:

重点代码:

参数有上下文,集合,和自己对应的item就可以了
 adapter = new MyAdapter(this, mDatas, R.layout.item);
package com.example.mylistview.ui;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import com.example.mylistview.R;import com.example.mylistview.adapter.MyAdapter;import com.example.mylistview.domain.Bean;public class MainActivity extends Activity {  private ListView listView;  private List<Bean> mDatas;  /**   * 适配器   */  private MyAdapter adapter;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    initData();    listener();  }  private void listener() {    // TODO Auto-generated method stub    listView.setOnItemClickListener(new OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,          long arg3) {        // TODO Auto-generated method stub        startActivity(new Intent(MainActivity.this, SecondActivity.class));      }    });  }  private void initData() {    // TODO Auto-generated method stub    mDatas = new ArrayList<Bean>();    Bean bean = new Bean("Android新技能 Get",        "Android-打造万能的ListView和GridView适配器", "2015-08-05", "10086");    mDatas.add(bean);    bean = new Bean("捡到权志龙一个",        "在星巴克捡到权志龙一个", "2015-08-06", "10086");    mDatas.add(bean);    bean = new Bean("GetTOP一个",        "在韩国首尔捡到TOP一个", "2015-08-07", "10086");    mDatas.add(bean);      adapter = new MyAdapter(this, mDatas, R.layout.item);    listView.setAdapter(adapter);      }  private void initView() {    // TODO Auto-generated method stub    listView = (ListView) findViewById(R.id.listView);  }}

item布局:

<?

效果图:

Android—万能ListView适配器images/loading.gif' data-original="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARwAAAG/CAIAAAAFHv/3AAAgAElEQVR4nOy953cbR57vrT9FE+7s3b17d/fsPmeePXNHY409M/bYV5asYCtZonIe2RrLtrIsW5IlW4ESEwgQgciJIAACYABBAiBIZIBEzjl1IgCGt35e1MM2TFEUJYNBnPocHZ1CofrX367uL+rXBXRxQw4CgdSPHzZs2JCfo1AokIWfU65LkJUsr7qAdSPytROcn6MuAcHLHzZs2FCEQCD144cNGzaUSqVSqYQgCIIgdSnXPeByl1ddwLoR+doJLs1Rx+A/bNiwAZRQFEVRtC7lugdc7vKqC1g3Il87wcgcdQz+w4YNG1AIBFI/oKkgkDrzw4YNGzAMwzAMvP6ZZTJuvQIud3nVBaxLwegca0HMyvfqj6aqC6TEOsZcVqDU5eA1ugyWQ2qdTQWBQGD6t4bErBvB6BxrQczK9yo01RoSs24Eo3OsBTEr36sw/YNA6gw0FQRSZ6CpIJA6sxZNlc1mEQSZV0mmrRiGZTKZ2iw2nU4/2ziXyy2rSAjkedTTVP39/RaL5YXNRkdHBwcHa2vS6TSHw0EQpFgsRqPRBw8eCIXCaDSaTCYdDodarW5tbf3yyy/dbjeGYSiKnjt3LhKJgG0jkciZM2fm7UKj0dy4ccPr9aIoymazrVYrhmHJZLJUKj2rJ5vNQgdC6shipkqn00eOHBkYGFhirJs3b7JYrBc2U6lUQqGwtiYQCGzdurVQKLjd7n379u3bt+/EiRPvvPNOa2vr3r17Hz9+LBKJLBZLoVDIZDJut3vPnj16vd5qtSqVSj6fv23bNoVCoVQqJyYmMAxzOp2gwaefftrd3f3VV189ePDg6tWrBw8eNJvNtfsNhUJffPHFvn379u7de/ny5Xg8vqDgUCg0b0MIZBEWM1VPT8/27ds///zz2tQLwzAUReelZ+DlPFPVtnk2nat9izQVhmEqlerBgwcTExNHjx7NZDJ79uyp3XZ4ePjkyZObN28+cuQIg8G4f//+rVu33n777fv379+/f1+v12ez2a1bt7777rtnzpw5fPjw3r17L168eOXKFa1WG4vFwC4AxWLxzJkzT548yeVy2Wz2q6+++uqrrxYULJFIzpw5M68TIJDn8VxToSh64cKF7u7uvXv3BgIBUHnnzp3m5uZjx47t3LmTwWAAdzU2Nu7atev06dOHDx9msVgIgpw+ffq77747cOBALBYbGxs7efLk7t27z507B0YSgUDQ1taGYdj4+PjRo0d379599erVLVu2FAoFg8Hw/ffff/jhh5999tnp06clEsmHH35Ip9MZDAaDwQBZHIIgBw8eDAaDKIoWi0W/379v3z7wcBiQLZVK2Wy2VCpVKBRyufz69evd3d2pVEqhUHz//ffkAQYCgS1btiQSCfAyHA53dXVhGJbNZr/99ts9e/YcPHhQrVa73e7du3e/9dZbN27cWL7TAFlPPNdUoVBo9+7dyWTy9u3bTCYTVJ4/f/769euJRMJkMm3ZsiUejw8ODu7atcvn8wUCgQMHDgBTvfPOO1Qq1efz5XK5vXv3SiSSXC5Hp9NPnTpVKpXa29vv3r1bKpX+9re/NTc3p9NpiUTyzjvvFAoFr9fb39//6NGj8+fP9/f3GwyGjz76SCqVXrly5ebNm+Pj4xiGoSi6f/9+Op2u1WoPHz584MCBN99889ChQydPngQi79+/f+7cuXv37p06daqxsVGj0Zw9e/b8+fMnT540GAzkAVoslp07dz57N0Wj0c6fP59MJg0Gw/bt22OxGJ/PP3nyZCaTqX/3Q9YjzzVVe3v7rVu3MpnMwMDAoUOHQPJz/vx5kUiEYVg2m922bVswGHz69Ont27fBJiD9QxBky5YtLpcLwzC73b5t2zaQdCWTyffeey8QCABTJRKJLVu2hMNhrOaeyul0Xrt27dixY7t27bp69WpfX9/+/fsRBGEymXw+H8Mwj8fz4MGDzZs3X79+PRqN3rhxo6mpKR6PUyiUU6dOARn379//+9//3tTUdP78+cePH3d0dIyMjOTz+Ugkks/nyQMkTVUsFk+fPr1///6GhgYMw44cOfL3v/+9ra2ttbX1nXfecTgcMP2DvBQLmyqfz+/du3ffvn3Hjx8/cuTIm2++Cab1ak21devWYDD44MGDx48fg61qTeV0OjEMM5vNO3fuBPcnuVzuvffe83q9wFTRaPS9994Ds+GkqbLZrEQiefr06WeffdbV1TU+Pt7Q0ICiKIPBAKbSarWPHz/evXt3KBTCMGxiYuLDDz80GAwffPABOQrdv3+/qalpdHT04cOHjx8//uqrrx49enTr1q39+/f39PSQx+j1et9///1UKoVhWDqdHhkZ2bp1K4ZhDQ0N3377rUAgEAgEYrE4mUxCU0Feih9NheM4juOgrNPpDh48mJnj6dOnd+7cQVH0k08+mTdSCQSCY8eOgQVlzp07VztS4TieTCa3bds2OjqKYVhfX9+ePXvy+TwwVS6X27Nnj0ajwTDMaDS+++67hUIhEok0NDQwmcyrV6+eOnVKqVSeOHECwzAmkykQCIA2FEUPHjwYCoWA2idPnvz+97//7rvvyIv+/v37+/fv/+STT3bv3t3Y2Hjz5s3Lly/39fXFYrFsNksebD6fb2hoYLPZYJ7dYDBs27YNw7Dbt2/fu3cPPBodjUYxDOvq6jp58iSIX9tLK1xelZ2ue8HYHHUMvrCprl+/TqVSyXqPx7N9+/ZEIvGsqZLJ5IkTJxoaGs6ePbt///55psJxXCQS7d69+5NPPvnoo4/6+vowDAOmwjBMLpdv3br13Llz586dA1kii8USi8Vyufz27dsWi+X27duPHj3CakwFfrB44MCBUChUKpXUavWePXtOnjy5c+dOqVQK8sz79+9LJBIMwzgcTmNj461bt8C3AuPj41evXq09WIfDcfTo0ZMnT3766ad79uxhMBgYhgWDwWPHjp0+ffrMmTNXr15FEMRms/31r3+9c+fOWjj9a+RaXDeCsTnqGHzh9C+Tycz7njSdTqMoms1myUk2UINhWD6fd7lc4I4FXNbpdJqckkZRNB6POxwOkGhhGAYWSQNvRaNRp9OZy+VAHoggiFKp/Pjjj2k0GoZh165dA5MTAoFAJpNhGOZ0OsHkRCqVevjwYUNDQ39/f7FYVKvVYPYCw7DHjx9LJJJr167t2bNHpVKJRKKDBw+ePHny448/Bg1qAbMjdrudlAcq3W63x+Mhp+BDoRA5BQqBLM6a+5lSPp/3+XzAuuB/UABlBEGCwSD4ljadTtd+75TP58FUXjweB1krOV2ey+Wi0WitbSCQ5WPh9O8fYdx/7QSvuoB1KRibo47BoaleG8GrLmBdCsbmqGPwHzZs2LDGJa5An64RMetGMDbHWhCz8r0KTbWGxKwbwdgca0HMyvfqj6aqC6TEOsZcVqDU5eC1uwzqCzQVlFp/XrvLoL7U2VQQCASaCgKpM9BUEEidgaaCQPBcLqdWq3teBFhV4YXRoKkgEDwUCvF4vMCijI+Ps9lsaCoIZEmEQiGlUrl4m3w+z+PxVtpUoVAokUi8sFksFguHw7U1pVIJPCk8r6VIJEomk8Vi0Ww2m2rweDwoio6NjeVyORzHEQQZGBjw+/09PT3ktgiCeL3eiecQDAbB7gqFgkQiSSQSpVIpkUhYrVYcxzEMK5VKIE4gENBoNKCMomhXV1c2m13k6NLptM/ne2EnLIjH41k8+DwwDEsmkz6fb2RkpKurq7u7u1Qq5eYoFAq1LcFjBwvGcblcxWKxtiYSiUSj0eftNxQKxePxpevEcTwcDoMHDvL5fCAQsNvtBoOht7dXKpUGAgEcx202m7qG4eHhwTmMRiM4HVarFbyr1WqLxaJOpwMv9Xr9S4lZ8IhWyFSlUqmrqysYDC5RmVKpNJlML2xms9mMRmNtTTqdplAoCIKQNSiKlkolJpMJnijR6/WDg4MajaapqWlwcNDpdKIoKpfLORwOiqJms7mxsZHFYjU1NQkEApFIBB5R0Wg0CoVCLBY/ffpULpcrahgaGgJffqvVapVKZbVaNRqN1+sViUQmk4nH4w0NDeE4Hg6HJRIJj8czGAy5XG58fJzFYhWLRfBXk3Ecj0ajYLkYUrnf7+/r61vwwHO5XCaTwXEcrHxI1qdSKaFQmM/nlUrlvI+bxSmVShKJRCKRNDc3j42NpdNpt9tNpVJZLBaDwZDJZKCZz+fj8Xh0Op3L5Xq93mfjSCSSdDpdW9Pf36/T6Xw+X1dXV+1JkUgk4XDYYDDY7fal68RxPBAIUCgUl8sVCoVkMllvb29LS4vBYADnF8fxWCxmsVj4fD6LxZqYmHA4HCNztLa2gk/Prq4ug8EwMTHBYDCy2SydTrdaraOjo0wm86XEPMvKmWpiYqK1tVUulz/71rzQ4OU8U9W2WUQKhmHPmspisdBotAcPHlAoFIvFAipTqRSdTifboCjq9XrT6TSDwQiFQna7ncfjxePxRCKBoijZLBKJcDicBXc9MDDw6NEjqVTK5/ObmpqGhoYoFMrw8HAsFgOe0ev1YrFYr9d3dHR4vd7Ozk4qlUqj0drb2xsbG8HiauBpzkWOjiwbDIbu7m4gqbW1FVxMOI6PjIzw+fzFt30e4O83s9nsUCiEIIjD4VCpVDiOh0IhgUCA43g4HG5ra/P7/TiO+3y+lpaWVCr1wl0AU2Wz2ZaWFnLICgaDFAqldgBcuk4cx6PRaCaTiUajHo/H4/FQqVSQdHg8HgzD/H4/l8ttbW1tamoSiUS1Z5BCoQBTyWQyHo8nlUqpVGo2m6XRaCKRSCAQvE6mkslkY2NjdDodHBKO44ODg2azGXycOBwOUAk+KsRiMZ/PN5lMGIbJ5XKDwcDlcnO5XCqV6urqotPpcrkcxHE4HKOjoziOZ7NZqVTKYDB6e3vnmQrDMBRFmU

用这个去适配另一个不同的布局:

新布局的Adapter一样继承自己的万能adapter:CommonAdapter

package com.example.mylistview.adapter;import java.util.List;import java.util.Map;import android.content.Context;import com.example.mylistview.R;import com.example.mylistview.util.CommonAdapter;import com.example.mylistview.util.ViewHolder;public class SecondAdapter extends CommonAdapter<Map<String, String>> {  public SecondAdapter(Context context, List<Map<String, String>> datas,      int layoutId) {    super(context, datas, layoutId);    // TODO Auto-generated constructor stub  }  @Override  public void convert(ViewHolder holder, Map<String, String> t) {    // TODO Auto-generated method stub    holder.setText(R.id.tv_item2values, t.get("values"));  }}

Activity.java代码:

package com.example.mylistview.ui;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import com.example.mylistview.R;import com.example.mylistview.adapter.MyAdapter;import com.example.mylistview.adapter.SecondAdapter;public class SecondActivity extends Activity {  private ListView listView_second;  private SecondAdapter secondAdapter;  private List<Map<String, String>> lists = new ArrayList<Map<String, String>>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_second);    initView();    initData();  }  private void initData() {    // TODO Auto-generated method stub    for (int i = 0; i < 4; i++) {      Map map = new HashMap<String, String>();      map.put("values", "条目" + i);      lists.add(map);    }    secondAdapter = new SecondAdapter(this, lists, R.layout.item2);    listView_second.setAdapter(secondAdapter);  }  private void initView() {    // TODO Auto-generated method stub    listView_second = (ListView) findViewById(R.id.listView_second);  }}

item:

<?

效果图:

Android—万能ListView适配器

备忘,希望能给大家带来帮助。

 




原标题:Android—万能ListView适配器

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流