RecyclerView数据加载完成后在onBindViewHolder中整体try{}catch引起的数据错乱问题

RecyclerView数据加载完成后在onBindViewHolder中整体try{}catch引起的数据错乱问题

    • ``问题描述:``
    • ``出问题的代码:``
    • `原因:`
    • `解决方式:`

问题描述:

在recyclerview的adapter设置完数据后,对viewholder的itemView设置点击事件,点击后在adapter的onBindViewHolder(final OrderLefHolder holder, final int position)返回的position居然是上一个的位置,可想而知在获取list.get(position)的数据的时候不是自己想要的

出问题的代码:

 @Override
    public void onBindViewHolder(final OrderLefHolder holder, final int position) {
        try {
    
            OrderBean.OrderDataBean orderDataBean = list.get(position);
            String s = orderDataBean.getAddTime().replace("T", " ");
            int index = s.indexOf(".");
          	holder.tv_time.setText(s.substring(0, index));
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (null != listener) listener.onClick(list.get(position), position);
                }
            });

        }catch (Exception e){
            Trace.e( e.getMessage());
        }
    }

原因:

  1. 整体直接使用tay{}catch导致在赋值的过程中出现异常后无法尽心后续流程,并且少了很多非空判断,刚好此时就出现了字符串截取异常 holder.tv_time.setText(s.substring(0, index));
  2. 在赋值过程中出现异常后导致后续的流程中断,在设置holder的itemView的点击事件的时候不能执行,导致复用的position停留在上个位置

解决方式:

  1. 尽量让try{}catch捕获尽可能少的代码块,以及对字符串进行判空操作
  2. 将holder的itemView的点击事件前移,保证position的正确性
@Override
    public void onBindViewHolder(final OrderLefHolder holder, final int position) {
        OrderBean.OrderDataBean orderDataBean = list.get(position);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != listener) listener.onClick(list.get(position), position);
            }
        });
        String s = orderDataBean.getAddTime().replace("T", " ");
        try {
            if (s.contains(".")) {
                int index = s.indexOf(".");
                holder.tv_time.setText(s.substring(0, index));
            } else {
                holder.tv_time.setText(s);
            }
        } catch (Exception e) {
			Trace.e( e.getMessage());
        }
    }

你可能感兴趣的:(Android,Error)