Android中使用listview出现数据紊乱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中使用listview出现数据紊乱相关的知识,希望对你有一定的参考价值。

环境:android开发新闻类app,其中新闻列表使用到listView。当用户点击某一条新闻的时候,想更改新闻标题颜色标记为已读。但是当下拉的时候,会出现其余的条目也会发生更改的现象。

代码:

@Override
public void onItemClick(AdapterView<?> adapter, View cellView, int position, long longPosition)
Object data = adapter.getItemAtPosition(position);
if (data instanceof HashMap<?, ?>)
HashMap<String, Object> map = (HashMap<String, Object>) data;
String link = (String) map.get("link");

if (link != null)
Intent webIntent = new Intent();
webIntent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse(link);
webIntent.setData(uri);
startActivity(webIntent);

TextView titleView = (TextView) cellView.findViewById(R.id.menuTextView);

if (titleView != null) // Mark this cell as readed
titleView.setTextColor(getResources().getColor(R.color.sub_title_color));



ListView的Item child view个数是最多能显示的item数+2。
也就是说,假设你当前看到ListView的item数最多是9, 那这个ListView其实最多只有11个child view, 但ListView可能有几十几百个Item, 怎么办呢?
当你向下滑动的时候, 把第12个item滑出来的时候,事实上第1,2个item已经完全看不到了,所以第12个Item是重用第1个Item的view, 第13个item是重用的第2个Item的view,也就是ListAdapter.getView()中作为参数传入的convertView。
这样明白了吧, 针对第1个Item view,如果你给里面的控件设置了一些属性,那么当你滑动listview的时候,第12个item上也会是一样的item view。
So, 两种办法:
1) 在ListAdapter.getView()这个方法中, 每次都是重新创建一个view return。
2)在ListAdapter.getView()这个方法中,还是会重用convertView,但是每次都要重新去初始化convertView的属性。
参考技术A 这个应该是屏幕显示的问题
android中判断是一屏一屏的显示 你的代码就相当于每个屏幕的相对应位置都标记为已读
adpater创建的view的总高度,不会超出屏幕的高度,所以view的个数是固定的,当滑动加载后面的数据时,就会用划出屏幕的view来显示新的
数据,而此时,这个view已经设置了背景颜色,因此滑动之后新加载的数据,他的view也会有背景颜色,在设置背景颜色前,先要把原来的背景颜色清除追问

我觉得你说的原因比较合理,就是android里面采用的缓存机制。使得新加载view的时候使用已经缓存的view。但是你说的这个方法貌似还是不能解决问题。

追答

我的太久啦 找不到你看看我给那

的地址 解决挺好的主要是第三条 百度太坑了

参考技术B

个人建议,可以通过数据模型来标记一个新闻是否已读的属性。

无论列表怎么变化,如何缓存,列表的适配器的getView方法,更新列表显示时,做新闻是否已读的颜色处理便可。


比如数据模型:

public class NewsItem 
    public String title; // 新闻标题
    public String text; // 新闻内容
    public String iconUrl; // 略缩图URL地址
    public boolean visited = false; // 是否已读

配置个BaseAdapter,关联到ListView。剩下的工作,OnItemClick做下工作。


ListView的ItemView是复用的,你一直都更新控件的颜色就是了。

本回答被提问者采纳
参考技术C 饿。。
我没明白你的意思。
android.app.activity这个类是不能直接设置adapter的,
如果你想在一个activity中直接设置adapter,
可以用listactivity.
这个类是activity的子类,
所以activity有的功能它都有,并接它还有listview的功能,
你可以在这个activity中直接通过this.setlistadapter(adapter);方法来为这个activity设置adapter。
另外,虚机团上产品团购,超级便宜
参考技术D 数据的填充和布局,都是在Adapter中进行的,如果你要修改某一项,请直接修改Adapter,之后用notifyDataSetChanged()方法来更新。

列表的左滑按钮点击引起布局紊乱

在开发中,使用UITableView显示数据,并对其进行操作时,当我们开启编辑模式后,通过左边的按钮对数据源进行了操作并刷新数据源,因为重用的问题可能会导致下一个显示的cell的布局出现紊乱,如图:

技术分享

,我发现这种情况只要向左滑动cell又会恢复正常。

 

 

解决:

当我们点击了左边的按钮时,首先先关闭可编辑模式,就能在刷新表格之前收起按钮,恢复到原来的样子,便不会影响布局

以上是关于Android中使用listview出现数据紊乱的主要内容,如果未能解决你的问题,请参考以下文章

Android ListView scrollby 剪辑列表中的项目

解决RecyclerView&ListView滚动到顶部或者底部边界出现阴影问题

列表的左滑按钮点击引起布局紊乱

Android ListView动态刷新某项Item

Android:线程从网络加载数据后更新Listview

Android ListView的数据如果有112个,右侧会出现一个可以拉动的快速默认滑动条,111个不会出现的