ListView通用Adapter 发表于 2016-11-11 | 分类于 Adapter | 双11人人都在遛京东,喂天猫,逛淘宝,而作为程序员我们只能撸代码。。。没有最好,只有更好,两行代码展示一个聊天列表,打造一个通用适配器是件一劳永逸的事 1. ViewHolder12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788/** * Created by zhangfeng on 2016/11/11. * 通用ViewHolder */public class ViewHolder { private Context mContext; /** * 存放的view的map,这里我们使用SparseArray(key是固定的为int类型) */ private SparseArray<View> mViews; /** * 位置 */ private int mPosition; /** * item view */ private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mContext = context; this.mPosition = position; this.mViews = new SparseArray<>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 通过 viewId获取 view * * @param viewId * @param <T> * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public View getmConvertView() { return mConvertView; } /** * TextView赋值 * * @param viewId * @param text * @return */ public ViewHolder setText(int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } /** * Glide 加载图片 * * @param viewId * @param errorDrawable * @param placeholderDrable * @param str * @return */ public ViewHolder setImage(int viewId, Drawable errorDrawable, Drawable placeholderDrable, String str) { ImageView iv = getView(viewId); Glide.with(mContext).load(str).error(errorDrawable).placeholder(placeholderDrable).into(iv); return this; }} 2. CommonAdapter1234567891011121314151617181920212223242526272829303132333435363738394041/** * Created by zhangfeng on 2016/11/11. * 通用适配器 */public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected LayoutInflater layoutInflater; protected List<T> mDatas; public CommonAdapter(Context context, List<T> datas) { this.mContext = context; layoutInflater = LayoutInflater.from(context); this.mDatas = datas; } @Override public int getCount() { return mDatas == null ? 0 : mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get(mContext, convertView, parent, R.layout.item_list, position); convert(holder, getItem(position)); return holder.getmConvertView(); } public abstract void convert(ViewHolder holder, T t);} 3. MsgAdapter继承CommonAdapter123456789101112131415161718/** * Created by zhangfeng on 2016/11/11. */public class MsgAdapter extends CommonAdapter<MsgBean> { public MsgAdapter(Context context, List<MsgBean> datas) { super(context, datas); } @Override public void convert(ViewHolder holder, MsgBean msgBean) { ((ImageView) holder.getView(R.id.iv_user_head)).setImageDrawable(mContext.getResources().getDrawable(msgBean.getUserHea())); holder.setText(R.id.tv_nick_name, msgBean.getNickName()) .setText(R.id.tv_msg_tip, msgBean.getMsgTip()) .setText(R.id.tv_update_time, msgBean.getUpdateTime()); } 4. 实体1234567891011121314151617/** * Created by zhangfeng on 2016/11/11. */public class MsgBean { private int userHea; private String nickName; private String msgTip; private String updateTime; public MsgBean(int userHea, String nickName, String msgTip, String updateTime) { this.userHea = userHea; this.nickName = nickName; this.msgTip = msgTip; this.updateTime = updateTime; }.........省略 getter setter 5. 测试12345678910111213141516171819202122232425262728293031323334public class MainActivity extends AppCompatActivity { private MainActivity self; private ListView mListView; private List<MsgBean> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initView() { self=this; mListView = (ListView) findViewById(R.id.id_list); } private void initData() { mDatas=new ArrayList<>(); MsgBean msgBean1 = new MsgBean(R.mipmap.man1, "隔壁老王", "晚上一起喝酒", "17:16"); MsgBean msgBean2 = new MsgBean(R.mipmap.girl, "小花妹子", "下班请你吃饭", "17:24"); MsgBean msgBean3 = new MsgBean(R.mipmap.boy3, "好基友", "好吧,那改天吧", "17:33"); MsgBean msgBean4 = new MsgBean(R.mipmap.girl5, "校花", "我已经开好房间了", "17:47"); MsgBean msgBean5 = new MsgBean(R.mipmap.girl1, "老婆大人", "下班了就赶快回来", "18:02"); mDatas.add(msgBean1); mDatas.add(msgBean2); mDatas.add(msgBean3); mDatas.add(msgBean4); mDatas.add(msgBean5); mListView.setAdapter(new MsgAdapter(self,mDatas)); }