让收藏、点赞的即时状态的交互正确的显示在ListView上

通过上面的两张图片能够清楚的看到:收藏按钮(五角星)、点赞按钮(赞的数目);

在做项目的时候,这个时很常见的。先讲解一下我的需求:

对于收藏:首先,这个具有收藏按钮交互的页面在整个项目中大约有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都会加载设置正确的数据进行显示!!

时间: 2024-12-30 02:50:27

让收藏、点赞的即时状态的交互正确的显示在ListView上的相关文章

MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2M和物联网IoT的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 基本概念 [MQTT协议特点]——相比于RESTful架构的物联网系统,MQ

jQuery判断当前元素显示状态并控制元素的显示与隐藏

1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible');   //true为显示,false为隐藏 $("#id").is(':hidden');   //true为隐藏,false为显示 if($("#id").is(':hidden')){ //逻辑代码 } 2.jQuery控制css的display $("#id").show();    //表示display:block $

android与fragment交互,fragment显示unity3d视图。

这两天刚刚接触Unity3d,之前一直是做android开发,对于Unity3d的开发有专门的人才,我主要涉及在Unity3d与android的交互,经过两天是实验终于完成了下面的效果: 本来想写几篇博客,来详细说明下Unity3d导出android Project然后再进行二次开发的过程,后来发现几篇博客,过程和我的类似,对于重复的过程我就不写了,大家参考他的博客就可以了.而且,包括了Unity3d调用android脚本,这一块我暂时还没有涉及. Unity3D游戏开发之Unity与Andro

理解Java对象的交互:时钟显示程序

实现: 结构: 对象:时钟  - 对象:小时                 - 对象:分钟 小时和分钟具有相同属性(值,上限),可以用一个类Display来定义这两个对象: 但是两者之间又具有联系(当分钟达到上限时,小时要加1),这时用另外一个类Clock来对它们进行管理: 首先用Clock类来定义一个clock的对象,用它来管理两个Display类型的对象,也即是clock的成员变量(min,hour),来管理它们之间的关系,再做显示: 总结:一个对象里面有两个对象. package clo

发票项目前后台数据交互和前台显示

总体步骤 1,扫描生成的二维码,跳转到>>>>>>>http://"+localIp+":"+request.getLocalPort()+ request.getContextPath()+"/f"+"/user/wUser/login"+"?companyname="+cpn+"&dutyparagraph="+dpg+"&i

手机卫士08_应用程序的flags_PopupWidnow悬浮窗体

1,应用管理的ui界面 条目界面的参考ui ①然后显示在ListView上即可(记得优化,程序大小的格式化等) ②获取ListView需要花费一定时间,所以放在子线程,再通过runOnUiThread()更新ui即可 ③创建一个FrameLayout,包含ListView,然后设置一个等待框,在获取的时候显示在页面上. 2,应用程序的flags (可以区分应用程序的安装位置,系统和用户安装的程序等) 2.1 ①在遍历每一个包信息的时候packInfo.application.flags(可能是多

Listview详解

Listview应该是最为常见的控件.对于大多数规则排列的界面,几乎都可以用ListView进行编写.对于单一界面来说,ListView既是最难的控件,又是使用最为频繁的控件.ListView 通常用于展示大量的数据,比如读取数据库中的数据.ListView优势也较为明显,比如显示大量数据时节约内存,自带ScrollView 的功能可以实现界面滚动等.ListView 控件的设计正好遵循MVC 设计模式.mode 数据数据模型,在ListView中具体可以指要显示到ListView 上的数据集合

Android ListView列表控件的简单使用

ListView 列表是我们经常会使用的控件, 如果想要自定义里面的显示的话是挺麻烦的, 需要新建XML.Class SimpleAdapter这两个文件, 较为麻烦. 如果我们只是想显示两.三行文字在上面, 却又不想那么麻烦呢? 那我们只要新建一个XML就够了.  这里以显示一个ListView项里三个TextView为例.  首先我们要创建一个XML文件, 这个XML文件是用来作为单个ListView项布局用的.  list_row.xml[java]<?xml version="1.

OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)

上一节我们启用了 Open vSwitch,本节将查看当前的网络状态并介绍 Open vSwitch 涉及的各种网络设备 初始网络状态 查看一下当前的网络状态. 控制节点 ifconfig 显示控制节点上有三个网桥 br-ex,br-int 和 br-tun. 从命名上看我们大致能猜出他们的用途: br-ex连接外部(external)网络的网桥 br-int集成(integration)网桥,所有 instance 的虚拟网卡和其他虚拟网络设备都将连接到该网桥. br-tun隧道(tunnel