使用RecyclerView时需要设置adapter,如果每次都写一个新的adapter类势必会写很多重复的代码,也会增加不少工作量。因此封装一个通用的Adapter是非常有必要的。
1.封装通用ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private View mConvertView;
private Context mContext;
public ViewHolder(View itemView) {
super(itemView);
}
public ViewHolder(View itemView, Context mContext) {
super(itemView);
mViews = new SparseArray<>();
this.mConvertView = itemView;
this.mContext = mContext;
}
public static ViewHolder createViewHolder(Context context, ViewGroup parent, int layoutId) {
View convertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
ViewHolder holder = new ViewHolder(convertView, context);
return holder;
}
//一些通用方法
public void setOnClickListener(int viewId, View.OnClickListener onClickListener){
View view=getView(viewId);
view.setOnClickListener(onClickListener);
}
public void setText(int viewId,String text){
TextView textView=getView(viewId);
textView.setText(text);
}
public void setImage(Context context,String imageUrl,int viewId){
ImageView imageView=getView(viewId);
Glide.with(context).load(imageUrl).apply(new RequestOptions().circleCropTransform()).into(imageView);
}
/**
* 通过viewId获取控件
*
* @param viewId
* @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;
}
}
2.创建support接口,声明方法
public interface MultiItemTypeSupport<T> {
int getLayoutId(int itemType);//onCreateViewHolder方法中根据viewtype返回xml layout的ID
int getItemViewType(int position,T t);//多种布局时返回当前ITEM的类型
void convert(ViewHolder holder, List<T> list, int position);//onBindViewHolder中进行布局内容填充等工作
}
3.创建Adapter
public class MultiItemTypeAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
private Context mContext;
private List<T> list;
private MultiItemTypeSupport<T> multiItemTypeSupport;
public MultiItemTypeAdapter(Context mContext, List<T> list, MultiItemTypeSupport<T> multiItemTypeSupport) {
this.mContext = mContext;
this.list = list;
this.multiItemTypeSupport = multiItemTypeSupport;
}
@Override
public int getItemViewType(int position) {
return multiItemTypeSupport.getItemViewType(position,list.get(position)) ;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int layoutId=multiItemTypeSupport.getLayoutId(viewType);
ViewHolder holder=ViewHolder.createViewHolder(mContext,parent,layoutId);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
multiItemTypeSupport.convert(holder,list,position);
}
@Override
public int getItemCount() {
return list.size();
}
// protected abstract void convert(ViewHolder holder, List<T> list, int position);
}
使用:
RecyclerView recyclerview_top;
List<TopRvBean> toprvList;
String imgUrl="";
String title="title";
TopRvBean topRvBean=new TopRvBean(imgUrl,title);
toprvList.add(topRvBean);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerview_top.setLayoutManager(linearLayoutManager);
MultiItemTypeAdapter adapter = new MultiItemTypeAdapter<TopRvBean>(context, toprvList, new MultiItemTypeSupport<TopRvBean>() {
@Override
public int getLayoutId(int itemType) {
if (itemType == 1) {
return R.layout.item_top_recyclerview;
}
return 0;
}
@Override
public int getItemViewType(int position, TopRvBean s) {
return 1;
}
@Override
public void convert(ViewHolder holder, final List<TopRvBean> list, final int position) {
holder.setText(R.id.text,list.get(position).getTitle() );
holder.setImage(context, list.get(position).getAvatarUrl(), R.id.image);
holder.setOnClickListener(R.id.rl_top, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
});
}
});
recyclerview_top.setAdapter(adapter);
原创来自:http://blog.csdn.net/lmj623565791/article/details/51118836/