欢迎观看本人博客,不管是误点还是随便看看的群众们,都希望能帮助到你们。
我们在做项目的时候通常会用到许多的RecycleView或者ListView,但是编写代码的时候会有很多重复,这样会增加我们的代码书写量,所以我们将ViewHolder封装成为一个类,我们在使用时就直接继承我们的这个封装类就可以了。
下面就来看看BaseViewHolder中的代码吧
public class BaseViewHolder extends RecyclerView.ViewHolder{
private View view;
private Context context;
//定义一个装有视图的集合
private SparseArray<View> sparseArray;
public View getView() {
return view;
}
public BaseViewHolder(View itemView, Context context) {
super(itemView);
this.context = context;
view = itemView;
viewSparseArray = new SparseArray<>();
}
//定义一个静态的方法,当使用RecycleView时调用
public static BaseViewHolder onCreatMyViewHolder(Context context, ViewGroup viewGroup, int layoutId){
View view = LayoutInflater.from(context).inflate(layoutId,viewGroup,false);
BaseViewHolder baseViewHolder = new BaseViewHolder(view,context);
return baseViewHolder;
}
//当使用ListView时调用的方法
public static BaseViewHolder onCreatMyListViewHoler(View view, ViewGroup viewGroup, int layoutId){
BaseViewHolder baseViewHolder =null;
if (view==null){
view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutId,viewGroup,false);
baseViewHolder = new BaseViewHolder(view,viewGroup.getContext());
view.setTag(baseViewHolder);
}else {
baseViewHolder = (BaseViewHolder) view.getTag();
}
return baseViewHolder;
public <T extends View> T getView(int resId){
View view = viewSparseArray.get(resId);
if (view==null){
view = itemView.findViewById(resId);
viewSparseArray.put(resId,view);
}
return (T) view;
}
//加载文字时调用的方法
public BaseViewHolder setText(int resId, String s){
TextView textView = (TextView) itemView.findViewById(resId);
if (s!=null){
textView.setText(s);
}
return this;
}
//加载网络图片时调用的方法
public BaseViewHolder setOnLineImage(int resId, String url){
ImageView imageView = (ImageView) itemView.findViewById(resId);
if (url!=null){
Glide.with(context).load(url).into(imageView);
}
return this;
以上就是我们封装BaseViewHolder中的代码了,看着是挺麻烦的但是我们在使用的实时会用许多RecycleView或者ListView,这时调用BaseViewHolder就比较简单了,现在然我们来看一下adapter中的代码吧
public class DisCoverAdapter extends RecyclerView.Adapter<BaseViewHolder>{
private Context context;
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//这里我们就直接返回BaseViewHolder
return BaseViewHolder.onCreatMyViewHolder(context, parent, R.layout.discover_recyclerview_item);
}
//这是我的Demo中的内容,大家看一下请求网络数据就好
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
DisCoverBean.ListBeanX listBeanX = disCoverBean.getList().get(position);
for (int i = 0; i < listBeanX.getList().size(); i++) {
//请求网络图片
holder.setOnLineImage(R.id.discover_recycleView_leftImage, listBeanX.getList().get(i).getCoverPath());
holder.setOnLineImage(R.id.discover_recycleView_rightImage, listBeanX.getList().get(i).getSubCoverPath());
//请求网络文字
holder.setText(R.id.discover_recycleView_leftText, listBeanX.getList().get(i).getTitle());
holder.setText(R.id.discover_recycleView_rightText, listBeanX.getList().get(i).getSubtitle());
}
}
@Override
public int getItemCount() {
//这里我们使用三元运算符进行判断
return disCoverBean != null ? disCoverBean.getList().size() : 0;
}
class OneHolder extends RecyclerView.ViewHolder {
private TextView left, right;
private ImageView leftImgae, rightImage;
public OneHolder(View itemView) {
super(itemView);
left = (TextView) itemView.findViewById(R.id.discover_recycleView_leftText);
right = (TextView) itemView.findViewById(R.id.discover_recycleView_rightText);
leftImgae = (ImageView) itemView.findViewById(R.id.discover_recycleView_leftImage);
rightImage = (ImageView) itemView.findViewById(R.id.discover_recycleView_rightImage);
}
}
看起来是很麻烦,但是当我们重复使用的时候很方便,关于BaseViewHolder就说到这,谢谢大家耐心的阅读,第一次写,大家多多见谅
LstView、RecycleView的ViewHolder封装
最新推荐文章于 2024-04-05 13:36:39 发布