当在类似朋友圈点赞功能时,需要用到单条数据刷新。
作为小白的我,所以百度到了这么一段代码处理:(这里的代码出处我实在找不到了,望谅解)
//实现单个item刷新
private void update(final Object data, final int position) {
//得到你屏幕上第一个显示的item
int firstVisiblePosition = listView.getFirstVisiblePosition();
//得到你屏幕上最后一个显示的item
int lastVisiblePosition = listView.getLastVisiblePosition();
if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
//得到你点击的item的view
View view = listView.getChildAt(position - firstVisiblePosition);
if (view.getTag() instanceof ViewHolder) {
//拿到view的Tag,强转成CommentAdapter的ViewHolder
ViewHolder holder = (ViewHolder) view.getTag();
// ..... 数据刷新处理
}
}
}
这里的position,即点击了ListView的position。
在点击后向服务器提交处理,返回成功后重新获取数据然后刷新适配器。但是这里我们需要做单条刷新,即我们要拿到对 应item的新数据去进行的数据去进行刷新,在没有分页的情况下,直接获取 list.get(positon)就能得到对应item的数据,但是怎么可能能得到所有的数据,必然存在分页的情况。
最开始我想到的是,在loadmore()的时候把pageNo传入到适配器,获取的时候按照pageNo去获取数据,得到返回list后怎么去
获取对应item的呢。
这时候就得判断点击的positon了。
如果以10条为一页。
点击第一条时,positon = 0 . pageNo = 1. data = list.get(0);
点击第二条时,position = 1. pageNo = 1. data = list.get(1);
.......
点击第十条时,position = 9. pageNo = 1.data = list.get(9);
这时都是第一页,list取跟position相同位置的数据即可。
点击第十一条时,position = 10,pageNo = 2 . data = list.get(0);
此时已为第二页,则我们应该获取第二页的第0条数据。
点击第十五条时,position = 14, pageNo = 2 . data = list.get(4);
同理,这里获取第二页的第4条数据。
.......
点击第二十一条时, position = 20,pageNo = 3. data = list.get(0).
此时pageNo已为第3页。我们应该获取第三页的第0条数据。
......
以此类推,当点击三十一条时,是第四页,postion = 30,应该获取第四页的第0条。
..
所以得出以下规律。
当pageNo = 1时。获取的数据就为position位置。
当PageNo > 1时。获取的数据为position%10。
这样就能在加载更多后的pageNo页的所有数据,然后根据postion得到我们需要得到的第几条数据。然后把该数据刷新到对应
的item即可。
.....
可是事实如此吗。
进行测试。
第一页测试正常。加载第二页。点击第二页的,也正常...... 加载第三页,点击第三页的,数据返回也正常。
可是,这时list在loadmore时数据是在往后不断增加,前面的数据依然还在,虽然我们加载到了第三页,可是前两页的数据我
们还是能看得见。
我们依然可以对前两页的可以去点赞。可是这时的pageNo是第三页,我们获取的也是第三页的数据。那么再根据上面的方法获
取到的并不是点击该页的数据,数据刷新当然出现了问题。
那么如果得到准备的pageNo,显示不能再根据加载更多时的pageNo去设置。
如何得到当前点击的位置的准确pageNo然后获取对应页数的所有数据呢?
显然还是要从position入手。所有的所有。这个position是绝对不会撒谎的。
我们再回过头看看这个规律。
点击第一条时,positon = 0 . pageNo = 1. data = list.get(0);
.......
点击第十条时,position = 9. pageNo = 1.data = list.get(9);
点击第十一条时,position = 10,pageNo = 2 . data = list.get(0);
.......
点击第二十一条时, position = 20,pageNo = 3. data = list.get(0);
......
以此类推,当点击三十一条时,是第四页,postion = 30,应该获取第四页的第0条。
..
这时会发现,
pageNo = position/10 + 1;
这里的10为分页条数。
那么我们把分页条数换成其他数试试。
(当前点击数 = position + 1)
当点击第1条时,0/9 + 1 = 1;
当点击第2条时,1/9 + 1 = 1;
.....
当点击第9条时,8/9 + 1 = 1;(此时为第一页最后一条)
当点击第10条时,9/9 + 1 = 2;(此时为第二页第一条)
....
当点击第18条时,17/9 + 1 = 2;(此时为第二页最后一条)
当点击第19条时,18/9 + 1 = 3;(此时为第三页第一条)
.....
显然也成立。
即 pageNo = position/分页数量 + 1;
至此,单条数据刷新分页问题已解决。
(本人为Android新人,文中如果有错误各位大佬指出下,我也不知道这样是不是处理标题的合适方式,如果有更好的方法,
望各位大佬不宁赐教)
第一篇博客
by the one
2018-1-26