使用NestedScrollView,当拉到底部的时候去请求服务器加载更多
mNestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
//滑到底加载更多
if(scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())){
presenter.nextPageData();
}
}
});
如果请求成功,会异步返回一组数据值,然后把这组数据添加到之前集合的后面
if(mDailyEntity.getIssueList()!=null && mDailyEntity.getIssueList().size()>=1){
mItemEntityList.addAll(mDailyEntity.getIssueList().get(0).getItemList());
}
当刷新数据界面的时候,简单粗暴地调用适配器的notifyDataSetChanged()方法,会出现闪屏的问题,这是由于notifyDataSetChanged()会导致整个recycleView重新布局和绘制。
这时候我们调用notifyItemInserted(int posistion)这个会很好地解决这个问题。notifyItemInserted(int posistion)只会局部刷新后面添加的子项。
final int lastsize = mItemEntityList.size(); //在向集合添加数据之前记录数据源集合最后的位置
if(mDailyEntity.getIssueList()!=null && mDailyEntity.getIssueList().size()>=1){
mItemEntityList.addAll(mDailyEntity.getIssueList().get(0).getItemList());
}
mDailyAdapter.notifyItemInserted(lastsize);
需要注意一点,如果添加的子项不是在最后,而是插入在数据的中间位置,那么插入之后,原来后面位置的数据position位置是不会变化的,需要手动再刷新一下数据的position位置,如下示例
public void addData(int pos){
mDatas.add(pos,'Insert One');
notifyItemInserted(pos);
// 加入如下代码保证position的位置正确性
if (pos != mDatas.size() - 1) {
notifyItemRangeChanged(pos, mDatas.size() - pos);
}
}
public void deleteData(int pos){
mDatas.remove(pos);
notifyItemRemoved(pos);
// 加入如下代码保证position的位置正确性
if (pos != mDatas.size() - 1) {
notifyItemRangeChanged(pos, mDatas.size() - pos);
}
}