Android中使用listview出现数据紊乱
环境:android开发新闻类app,其中新闻列表使用到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));
}
}
}
} 展开
代码:
@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));
}
}
}
} 展开
5个回答
展开全部
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的属性。
也就是说,假设你当前看到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的属性。
展开全部
这个应该是屏幕显示的问题
android中判断是一屏一屏的显示 你的代码就相当于每个屏幕的相对应位置都标记为已读
adpater创建的view的总高度,不会超出屏幕的高度,所以view的个数是固定的,当滑动加载后面的数据时,就会用划出屏幕的view来显示新的
数据,而此时,这个view已经设置了背景颜色,因此滑动之后新加载的数据,他的view也会有背景颜色,在设置背景颜色前,先要把原来的背景颜色清除
android中判断是一屏一屏的显示 你的代码就相当于每个屏幕的相对应位置都标记为已读
adpater创建的view的总高度,不会超出屏幕的高度,所以view的个数是固定的,当滑动加载后面的数据时,就会用划出屏幕的view来显示新的
数据,而此时,这个view已经设置了背景颜色,因此滑动之后新加载的数据,他的view也会有背景颜色,在设置背景颜色前,先要把原来的背景颜色清除
追问
我觉得你说的原因比较合理,就是android里面采用的缓存机制。使得新加载view的时候使用已经缓存的view。但是你说的这个方法貌似还是不能解决问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人建议,可以通过数据模型来标记一个新闻是否已读的属性。
无论列表怎么变化,如何缓存,列表的适配器的getView方法,更新列表显示时,做新闻是否已读的颜色处理便可。
比如数据模型:
public class NewsItem {
public String title; // 新闻标题
public String text; // 新闻内容
public String iconUrl; // 略缩图URL地址
public boolean visited = false; // 是否已读
}
配置个BaseAdapter,关联到ListView。剩下的工作,OnItemClick做下工作。
ListView的ItemView是复用的,你一直都更新控件的颜色就是了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
饿。。
我没明白你的意思。
android.app.activity这个类是不能直接设置adapter的,
如果你想在一个activity中直接设置adapter,
可以用listactivity.
这个类是activity的子类,
所以activity有的功能它都有,并接它还有listview的功能,
你可以在这个activity中直接通过this.setlistadapter(adapter);方法来为这个activity设置adapter。
另外,虚机团上产品团购,超级便宜
我没明白你的意思。
android.app.activity这个类是不能直接设置adapter的,
如果你想在一个activity中直接设置adapter,
可以用listactivity.
这个类是activity的子类,
所以activity有的功能它都有,并接它还有listview的功能,
你可以在这个activity中直接通过this.setlistadapter(adapter);方法来为这个activity设置adapter。
另外,虚机团上产品团购,超级便宜
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数据的填充和布局,都是在Adapter中进行的,如果你要修改某一项,请直接修改Adapter,之后用notifyDataSetChanged()方法来更新。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询