最近在项目中使用RecyclerView,遇到了一些焦点问题,特此记录下。
- 在删除一个item或者分页加载新的数据后,使用notifyDataSetChanged()方法后,焦点会消失或跳到其他位置,解决方案如下:
-
在Adapter中重写getItemId()方法,此方法用来唯一标识一个item。
@Override public long getItemId(int position) { return position; }```
-
设置唯一标识生效。
adapter.setHasStableIds(true);
-
禁用掉RecyclerView的动画。
mRecyclerView.setItemAnimator(null);
- 开发中产品要求点击某个item后返回来焦点还要在之前的位置上,解决方法也很简单,就是记录之前的焦点位置,返回后让RecyclerView滑动过去:
recyclerView.scrollToPosition(actorFocusPosition);
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
View view = recyclerView.getLayoutManager()
.findViewByPosition(actorFocusPosition);
if (view != null) {
view.requestFocus();
}
}
}, 50);
设置了50毫秒的延迟,是因为滑动需要时间,当然这个时间可根据情况自己修改。
网友评论