您的位置:首页 > 其它

The Adapter of ListView: Just adapt data to view, don’t do anything else

2016-03-17 19:26 411 查看
The design of SimpleAdapter is not good in my opinion.

An adapter should just adapter the data to view, not care to inflate xml to create Layout View, hold the member Views of the layout view, and, fill the datas to each member View one by one. SimpleAdapter does these things all together. It is high coupling design.

The solution is a ItemViewHolder class, which inflate and hold the layout view and its member views, and parse datas to fill them to member views one by one. And the most cool is, it’s layout view of ItemViewHolder set “this” as its tag. So that you can get the ItemViewHolder instance of the convertView in getView(…, View convertView, …) function.

See below code snippets.

In Adapter, passed in a List as data list.

1

List<Data> dataList;

and override getView() like this:

12
3
4
5
6
7
8
9
10
1112
13
14
15

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ItemViewHolder item = null;

if(convertView == null) {
item = new ItemViewHolder(context);
convertView = item.getLayoutView();
} else {
item = (ItemViewHolder)convertView.getTag();
}

item.setItemData(dataList.get(position));

return convertView;
}

ItemViewHolder is the views holder of the convertView.

12
3
4
5
6
7
8
9
10
1112
13
14
15
16
17
18
19
20
2122
23
24
25
26
27
28
29
30
3132
33
34
35

public class ItemViewHolder {

//The layout View of the item of the ListView.
private View layoutView = null;
//The member Views to display data.
private TextView textView = null;
private ImageView imageView = null;
… …

public ItemViewHolder (Context context) {
super(context);

initUI();
}

public View getLayoutView() {
return layoutView;
}

public void setItemData(Data data) {
textView.setText(data.getText());
imageView.setImage(data.getImage());
… …
}

private void initUI() {
LayoutInflater inflater = LayoutInflater.from(mContext);
layoutView = inflater.inflate(R.layout.item_view_layout, null);
//
textView = (TextView) layoutView.findViewById(R.id.textview);
imageView = (ImageView)layoutView.findViewById(R.id.imageview);
//This is the most important code.
layoutView.setTag(this);
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: