1 、RecyclerView套嵌RecyclerView,上拉加载数据太多导致数据处理耗时卡顿
因为了外面RecyclerView在加载更多的时候会刷新列表,而里面的RecyclerView相当于外面RecyclerView的一个item,每次调用notifyDataSetChanged的时候,会导致里面的RecyclerView的适配器,将所有数据都会重新onCreateViewHolder和onBindViewHolder一遍,导致往后加载更多次数越多,就会卡顿。如下处理,加载更多的时候,对里面的RecyclerView进行局部刷新,很好解决卡顿问题。
private RecyclerView recyclerView;
private OutAdapter;
private List<Entry> mEntitys;
private int positionStart = 0;
private int itemCount = 0;
public MyOutAdapter(){
mEntitys = new ArrayList<>();
}
public void addItem( List<Entry> addEntitys){
positionStart = mEntitys.size();
itemCount = addEntitys.size();
mEntitys.addAll(addEntitys);
}
public void onBindViewHolder(Context context, ViewHolder viewHolder, int i) {
if (null == outAdapter) {
recyclerView= viewHolder.getView(R.id.recyclerView);
outAdapter= new OutAdapter(mContext);
outAdapter.setEntitys(mEntitys);
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setFocusableInTouchMode(false);
recyclerView.requestFocus();
final StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
recyclerView.setAdapter(outAdapter);
} else {
//positionStart需要局部刷新的数据列表开始位置,itemCount需要刷新个数
outAdapter.notifyItemRangeChanged(positionStart, itemCount);
}
}
2、如下设置也可以解决套嵌事件处理冲突卡顿
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setFocusableInTouchMode(false);
recyclerView.requestFocus();
3、如果一个RecyclerView能解决的布局,最好还是不要使用RecyclerView套嵌RecyclerView