LstView、RecycleView的ViewHolder封装

  欢迎观看本人博客,不管是误点还是随便看看的群众们,都希望能帮助到你们。

  我们在做项目的时候通常会用到许多的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就说到这,谢谢大家耐心的阅读,第一次写,大家多多见谅
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值