通过上面的两张图片能够清楚的看到:收藏按钮(五角星)、点赞按钮(赞的数目);
在做项目的时候,这个时很常见的。先讲解一下我的需求:
对于收藏:首先,这个具有收藏按钮交互的页面在整个项目中大约有13+个;若算上,选项标签那就多的没法数了,也就是说页数基本上是不确定的;当点击该收藏按钮,会被点亮;再次点击则恢复原状态。中间在每次点击,操作成功之后会向服务器交互更新后台的收藏状态数据,便于下次进入时候保持收藏或者未收藏的状态。
对于点赞;基本上和收藏是一样的,只是多了赞的数量,要随着点击交互儿即时的改变赞的数字显示;
然后,问题出现了!
首先,说listView的机制。listView如果在第一次进入该页面而不让listView一次加载你所请求的所有item,而是根据手机屏幕显示的数量进行加载listView的item数量。当加载完第一版(手机屏幕所显示的item)之后,你拖动listView向上滑动来显示余下的你所请求的item。那么每显示下一条adapter 中 的 getView();就会被调用一次来设置这条item的数据以及view展示。然后,如果你再次的把listView向下拖动来显示listView的前几条信息,上面被遮挡隐藏的item每显示一条,adapter 中的 getView();又会被重写加载一次来设置该条item的数据以及view显示;
所以,如果你使用一般的方式当你点击收藏或者赞的按钮之后,并且即时的设置了ta的状态。当你遮盖住ta之后,再次把他拖出来的时候,会经惊讶的发现“怎么跟没有做操作的时候状态一模一样?”。再则,这些肯定是在你本地进行的,不可能直接同步到后台然后在调用新的已经更改股状态 的数据进行填充listView显示;因为这样太过于消耗手机内存了,而且每次交互都要重新加载页面,重新请求数据,这样深深的给用户带来了反感的体验。估计随即就把你的应用卸载了!然后,如果使用记住你的交互状态的话,对于单独页面也可能会行得通,但是对于几十个这样的页面,你要做多少重复多余的代码,估计你也能估算一下。还是太麻烦!
然后,这里我就分享一下我搞弄了三天的能够完美解决这种交互状态一直延续下去并且能与后台服务器同步的思路:
比如收藏的按钮,当你点击了收藏的按钮并向后台提交了状态之后。滑动listView之所以会出现bug,是因为此时没有发生变化的就是你本地的状态数据没有改变。然后,你的listView就会加载设置过时的老数据显示在listView 的 item上。所以,在listView无论社么时候加载设置数据,在为了让item显示正确的内容,一定要保证本地数据和后台数据的一致性。而本地含有此状态的数据一般有:包含该状态的对象什么的,也就是有:数据库表、该类的bean类对象、adapter进行适配的该类的bean类对象等之类;然后当你点击交互之后,向后台提交你的收藏状态之后,就要随即的更新你本地的所有的保存了该收藏交互的状态。这样就同等于你的本地数据一直就与后台数据同步!然后,无论你怎么滑动你的listView,ta都会加载设置正确的数据进行显示!!