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());
}
}
原因:
- 整体直接使用tay{}catch导致在赋值的过程中出现异常后无法尽心后续流程,并且少了很多非空判断,刚好此时就出现了字符串截取异常
holder.tv_time.setText(s.substring(0, index));
- 在赋值过程中出现异常后导致后续的流程中断,在设置holder的itemView的点击事件的时候不能执行,导致复用的position停留在上个位置
解决方式:
- 尽量让try{}catch捕获尽可能少的代码块,以及对字符串进行判空操作
- 将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());
}
}