RecyclerView适配器的省略写法
打造RecyclerView的省略写法
之前写过一篇打造万能的ListView适配器,后来学习了Google推出的RecyclerView。同样为了简(偷)便(懒),避免冗长的代码,可以这样来简化。
首先创建ViewHolder类,实现一些getView的方法,如TextView,Button,ImageView…etc.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
49public class ViewHolder {
//使用SparseArray来缓存View
private SparseArray<View> viewHolder;
private View view;
public static ViewHolder getViewHolder(View view) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
if (viewHolder == null) {
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}
return viewHolder;
}
private ViewHolder(View view) {
this.view = view;
viewHolder = new SparseArray<>();
view.setTag(viewHolder);
}
public <T extends View> T get(int id) {
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
public View getConvertView() {
return view;
}
public TextView getTextView(int id) {
return get(id);
}
public Button getButton(int id) {
return get(id);
}
public ImageView getImageView(int id) {
return get(id);
}
}
接下来创建RecyclerViewHolder类继承字RecyclerView的ViewHolder。1
2
3
4
5
6
7
8
9
10
11
12
13public class RecyclerViewHolder extends RecyclerView.ViewHolder {
private ViewHolder mViewHolder;
public RecyclerViewHolder(View itemView) {
super(itemView);
mViewHolder = ViewHolder.getViewHolder(itemView);
}
public ViewHolder getViewHolder() {
return mViewHolder;
}
}
接下来创建抽象类AutoAdapter继承RecyclerView的Adapter,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
49public abstract class AutoRVAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
public List<?> mList;
private Context mContext;
private AdapterView.OnItemClickListener listener;
public abstract int onCreateViewLayoutID(int viewType);
public abstract void onBindViewHolder(ViewHolder holder, int position);
public void setOnItemClickListener(
AdapterView.OnItemClickListener listener) {
this.listener = listener;
}
public AutoRVAdapter(Context context, List<?> list) {
this.mContext = context;
this.mList = list;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(onCreateViewLayoutID(viewType), parent,false);
return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, final int position) {
onBindViewHolder(holder.getViewHolder(), position);
if (listener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(null, v, position, holder.getItemId());
}
});
}
}
@Override
public int getItemCount() {
return mList.size();
}
}
到现在我们已经把Adapter的过程封装起来,使用的时候只需继承AutoRVAdapter实现其抽象方法即可。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class TestAdapter extends AutoRVAdapter {
public TestAdapter(Context context, List<?> list) {
super(context, list);
}
@Override
public int onCreateViewLayoutID(int viewType) {
return R.layout.item_row;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String item = (String) mList.get(position);
holder.getTextView(R.id.id_textview).setText(item);
holder.getImageView(R.id.iv_img).setImageResource(R.mipmap.ic_launcher);
}
}
通过以上步骤我们就将整个过程封装起来,只要使用RecyclerView的时候将代码复制过去继承AutoRVAdapter,重写方法即可,非常方便。
