Android 还有一个getView调用了多次
myAndroid 还有一个getView调用了多次,android,listview,Android,Listview,myListView中的每个项目都包含一个ImageView和一个TextView,其中将填充远程信息 我获得了ImageView的URL,因此我启动了一个AsyncTask,该任务下载图像,并使用下载的位图调用setImageBitmap 这非常顺利,但是在创建ListView时,经常调用getView()。 对于前10行(只有7行可见),它调用了大约7倍的getView。(因此:0、1等、10、0、1等) 然后我可以平滑地滚动到第10项。但是在这之后,对于前10个项目,listview对每一
ListView
中的每个项目都包含一个ImageView
和一个TextView
,其中将填充远程信息
我获得了ImageView
的URL,因此我启动了一个AsyncTask
,该任务下载图像,并使用下载的位图调用setImageBitmap
这非常顺利,但是在创建ListView时,经常调用getView()
。
对于前10行(只有7行可见),它调用了大约7倍的getView
。(因此:0、1等、10、0、1等)
然后我可以平滑地滚动到第10项。但是在这之后,对于前10个项目,listview对每一新行再次调用的次数大约是getView的7倍。(这将导致滞后…)
但是当我从AsyncTask
中删除setImageBitmap
时,这一切都不会发生
有什么问题吗?是不是有些布局太大,会导致另一个getViews连环出现
下面是一些代码:
<ListView
android:id="@+id/mylist"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:layout_below="@+id/mydivider"
android:divider="@+color/mycolor"
android:dividerHeight="2dp"
android:fadingEdge="none"
android:fastScrollEnabled="true"
android:listSelector="@android:color/transparent"
android:scrollbars="horizontal"
android:scrollingCache="false"
android:smoothScrollbar="false" />
更多信息:
创建新视图时,stacktrace显示getView是从ListView.makeAndAddView()
但是在GetView的无用连环中,它来自ListView.measureHeigthOfChildren()
因此,当我设置位图时,布局似乎发生了变化…我建议您观看此视频
基本上,android会多次调用getView来计算视图高度和其他内容,因此您需要在异步中实现某种缓存,如果不使用身份验证,请检查哪个缓存有问题,因为您的ListView不知道每个项目的属性。初始化时,ListView将测量其所有子项,并根据这些信息进行绘制。使用AsyncTask所做的是更改列表中项目的大小,而不是让ListView完全重新绘制自己。这会导致ListView行为异常 解决方案:您应该通过在异步任务的后期执行中使用notifyDataSetChanged()通知适配器来更新ListView。这将允许ListView使用新信息绘制自身 我希望它能起作用 以下是一些有用的完整链接:
问题出在ListView的布局中
当我将参数
layout\u width
更改为wrap\u content
时,该参数被设置为wrap\u content
,问题消失了…很抱歉回复太晚。我在gallery小部件的适配器中也遇到了同样的问题。我使用了通用图像加载器Martijn的解决方案对我有效。我所要做的就是在图像完全下载并设置imageView时添加notifyDataSetChanged()。我尝试在ListView中使用fill\u parent作为高度,但我无法完美实现,但我曾经尝试过阻止创建ConvertView,如果它已经存在的话。我觉得它很好用
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView != null)
return convertView;
else {
//your code...
}
}
是的,看起来如此,甚至我认为当图像被添加时,父级应该重新布局它自己,因为父级高度也会受到影响..但这是我认为不确定的..看这个链接:notifyDataSetChanged在我只想更新一个视图时不会有帮助。我不会改变阵列的谢谢你。工作100%,也为我工作。我想知道这是否与listView的固有大小受到限制有关,如果它匹配其父级而不是填充它?较大的listView在逻辑上会更频繁地调用getView(),因为有更多的单个项目可用。在我的例子中,getView被反复无限地调用一个位置,即使这个位置并不特别。我在同一屏幕上有多个视图类型,就像那样,还有一个视图类型。问题是,我在一个布局中有多个项目,其中一个项目的宽度由layoutwweight=“1”确定,以在其他小部件之后占据剩余空间。将其重新设置为固定宽度解决了问题。不敢相信这实际上解决了我的问题+1.这真是难以置信。我有一个ViewPager,每个页面都有一个ListFragment,我调试了几个星期,试图弄清楚为什么刷卡如此频繁。在这段时间里,我所要做的就是将ListView的高度设置为
match\u parent
。
row = convertView;
ViewHolder holder;
if (row == null) {
row = vi.inflate(R.layout.mylayout, null);
holder = new ViewHolder();
holder.image = (ImageView) row.findViewById(R.id.myimage);
holder.title = (TextView) row.findViewById(R.id.mytext);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
holder.title.setText("text");
holder.image.setImageResource(R.drawable.mydefaulticon);
holder.position = position;
startMyTask(content, holder, position);
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView != null)
return convertView;
else {
//your code...
}
}