我之前工作内容是维护旧的项目,而旧的项目里面用的几乎都是listview,后面公司来了个新的产品经理,他一来就吐槽我们的app,每次获取新的一页列表后,所有列表项(包括前面几页的列表项)都是要全部刷新一遍,这个体验太差了,他说要实现局部刷新,才符合要求。我只好硬着头皮把项目里面的listview慢慢换成recyclerview.
? ? ? 换成recyclerview之后,很棘手的一个问题就是,分页问题。因为之前的listview分页都是别人在listview的基础上封装了一个专门用来刷新的refreshlistview。我一开始自作聪明的把refreshlistview继承的listview换成recyclerview,没想到引出一大堆的问题,网上搜索各种百家乐凯发k8的解决方案,最后发现代码越来越臃肿,我实在看不下去了。后面打算直接用recyclerview,分页问题再另外想办法来实现。
我总结了两种情况下用recyclerview实现分页效果:
第一种情况,页面中,只使用recyclerview为滑动控件(没有在外层添加netscollview或者scollview)
1.实现分页代码: int p=1;//第几页 int psize=10;//每页最大item数量 private int lastitemposition;
void setscollnextpage(){ rlistview.addonscrolllistener(new recyclerview.onscrolllistener() { @override public void onscrollstatechanged(recyclerview recyclerview, int newstate) { if (newstate == scroll_state_idle && lastitemposition == adapter.getitemcount()){ if(isnext) { p ; getnextpagedata(); } } } @override public void onscrolled(recyclerview recyclerview, int dx, int dy) { recyclerview.layoutmanager layoutmanager = recyclerview.getlayoutmanager(); if (layoutmanager instanceof linearlayoutmanager){ linearlayoutmanager manager = (linearlayoutmanager) layoutmanager; int firstvisibleitem = manager.findfirstvisibleitemposition(); int l = manager.findlastcompletelyvisibleitemposition(); lastitemposition = firstvisibleitem (l-firstvisibleitem) 1; } } }); }
2.实现局部刷新代码:
void?getnextpagedata(){
//获取下一页数据
//新的数据为newlist,当前list的size=pos
if (p == 1) { adapter.notifydatasetchanged();//当页面为1,直接刷新所有数据 } else { if (newlist != null && newlist.size() > 0) { adapter.notifyitemrangechanged(pos, newlist.size());//pos为插入的列表开始位置,插入的大小为新的数据列表大小 } }
?
}
?
第二种情况,recyclerview 外层包着scollview或者netscollview
如果用第一种情况的方法,会发现,上述方法不起作用。所以我把滑动的事件放在scollview或者netscollview上
1. 先重写了一个mscollview extends netscollview(或者 scollview)
在mscollview 里面重写了方法
mlistener?mlistener;
@override protected void onoverscrolled(int scrollx, int scrolly, boolean clampedx, boolean clampedy) { super.onoverscrolled(scrollx, scrolly, clampedx, clampedy); if (scrolly != 0 && mlistener != null) { mlistener.onmyscroll(clampedy); } }
public interface mlistener {
? ? void onmyscroll(boolean c); //滑动到底部回调方法
}
public setmlistener(mlistener mlisterner){
mlistener=mlisterner;
}
2.在activity或者fragement 中使用mscollview(layout 布局中同样要使用重写后的mscollview)
mscollview mscollview ;
mscollview. setmlistener(new mlistener (){
void onmyscroll(boolean c){
? ? ? if(c){
p ;//页码加1
getnextpagedata();//获取下一页数据的方法
}
}
})
?
最后,以上方法,还存在一些不足,在这里,我就没有写出来了,这两个方法都是比较简单粗暴,可以实现用recyclerview局部刷新数据和分页加载的目的。希望有高手指点一下,看还有没有更加简单优化的实现方案