文章目录
  1. 1. 打造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
49
public 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
13
public 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
49
public 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
18
public 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,重写方法即可,非常方便。

文章目录
  1. 1. 打造RecyclerView的省略写法