实际上我的问题与this家伙的问题相同。但我不知道如何解决它。这是我的listview xml文件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="3"
android:background="#CCCCCC"
android:id="@+id/tabs">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#CCCCCC"
android:textSize="20sp"
android:textColor="#000000"
android:text="@string/NewTask"
android:id="@+id/tab1"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#CCCCCC"
android:layout_weight="1"
android:textSize="20sp"
android:textColor="#000000"
android:text="@string/Friends"
android:id="@+id/tab2"
/>
<Button
android:layout_width="fill_parent"
android:background="#CCCCCC"
android:layout_height="wrap_content"
android:textColor="#000000"
android:layout_weight="1"
android:text="@string/AddPeople"
android:textSize="20sp"
android:id="@+id/tab3"
/>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#000000"
android:layout_below="@+id/tabs"
/>
</RelativeLayout>
我正在尝试从onpostExecute
的{{1}}调用我的listactivity中的函数。
这是我的listactivity的功能。
AsyncTask class
这个bmp是在public void SetImage(Bitmap bmp,int index)
{
View v = this.ls.getChildAt(index);
ImageView img = (ImageView)v.findViewById(R.id.tasks_userimg);
img.setImageBitmap(bmp);
}
类中下载的位图,asynctask
是列表视图,ls
是列表视图中项目的索引。当postexecute运行时,我称之为使用参数来更新listview项目图像。
问题与我在链接中提到的完全相同,即当我滚动它时会给我错误。但他通过更改listview的布局宽度来解决问题,但它在这里不起作用。
答案 0 :(得分:0)
似乎与许多其他人一样,您对此特殊视图存在一些问题。
我强烈建议您观看演讲“the world of listView”。
他们谈论了很多与listView相关的主题,包括在同一视图上多次调用getView的主题。简而言之,它之所以发生,是因为还调用了getView来测量listView项。您可以使用(并且应该)使用convertView以避免不需要的数据膨胀和提取。
关于问题本身,你不应该在listView项目上使用findViewById,因为它们会被重用。例如,在用户向下滚动的情况下,可以将为第0个位置设置的视图设置为第7个位置。
如果您想从listView更新单个项目,可以使用以下内容:
// itemIndex is the index of the item to update
final View v=listView.getChildAt(itemIndex-listView.getFirstVisiblePosition());
//now you update your view according to what you wish .
//you must of course handle the cases that you can't get the view .
当然,一旦你这样做,你还必须更新适配器后面的数据,以便下次用户滚动到这个项目时,它会显示位图。
你应该做什么取决于你使用的asyncTask。
我假设您在listview填充其项目时下载了多个位图。如果是这种情况,请查看this sample,或使用我的建议:为每个viewHolder设置一个asyncTask。每次调用getView时,取消旧的getView并为当前项创建一个新的。
答案 1 :(得分:0)