ListView通用Adapter

双11人人都在遛京东,喂天猫,逛淘宝,而作为程序员我们只能撸代码。。。没有最好,只有更好,两行代码展示一个聊天列表,打造一个通用适配器是件一劳永逸的事

1. ViewHolder
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* 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. CommonAdapter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* 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继承CommonAdapter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 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. 实体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 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. 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public 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));
}


通用适配器