ListView的Intent跳转详情页, 滑动与点击Position错乱导致数据混乱问题解决

问题描述

具体问题是这样:今天在项目中遇到了从一个ListView界面,通过点击Item中的控件(我这里做的是图片,后改为布局)跳转到详情页面,并且将部分数据传入到下一个Activity。

来个图

ListView的Intent跳转详情页, 滑动与点击Position错乱导致数据混乱问题解决_第1张图片
ListView的Intent跳转详情页, 滑动与点击Position错乱导致数据混乱问题解决_第2张图片

问题分析

百度了一下,前辈们早已遇到这样的问题,就是没有给出具体的解决办法,大体思路就是:AbListView中获取getView()和滑动操作是异步进行的,其中滑动操作在一个FlingRunnable的支线程中运行,所以这就导致了在ListView在滑动时可能已经滑动到了第十行,但可能第二行的数据这时就被直接使用了,这就是导致数据加载错乱的根本原因。

问题解决

看了前辈们的指导还是无从下手,怎样能让活动的Position和getView的Position同步呢?我选择不管它!问题归根到底就是convertView复用的问题,不仅复用了布局还顺便复用了数据。

第一步:在convertView == null修改如下:

if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_produces, null);//填充布局(只复用ChildView的布局就好了!)
convertView.setTag(holder);
}else {
        holder = (ViewHolder) convertView.getTag();
        }

整体可以仿效下面这个样子:只复用布局,其他的随用随取。
ListView的Intent跳转详情页, 滑动与点击Position错乱导致数据混乱问题解决_第3张图片
第二步

填充数据即可。

Intent跳转数据在ListView展开详情的用法

1,使用Bundle存储要传递的数据,推荐Bundle因为什么数据它都能传递。

Bundle b = new Bundle();
b.putInt("position", (Integer)position);
b.putInt("img", (Integer) mData.get(position)
                            .get("img"));
b.putString("name",(String) mData.get(position).get("info"));

2,开启Activity,将数据通过Intent传递

Intent info = new Intent(getActivity(), xxxActivity.class);
info.putExtras(b);
startActivity(info);

3,xxxActivity接收数据并且赋值

“`
Bundle b = getIntent().getExtras();//得到传过来的数据
String name = b.getString(“name”);
int ing = b.getInt(“img”);

tv_pro_name.setText(name);//这里赋值


总结

关于ListView的数据加载错乱问题,通常都是有图复用导致的,复用的好处不言而喻,但是有时候我们要对复用进行处理,把敏感的地方,例如数据,就要考虑选择性的复用了。

你可能感兴趣的:(ListView)