【问题标题】:Problems while setting the ImageView source in the ItemLayout of a ListView在 ListView 的 ItemLayout 中设置 ImageView 源时出现问题
【发布时间】:2011-07-06 13:50:36
【问题描述】:

我在设置 ListView 项目内的 ImageView 源时遇到问题。问题如下:

在 ListItems 的 XML LayoutFile 中,我有一个 ImageView 和一个 TextView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:paddingLeft="10dp"
android:orientation="horizontal">

<ImageView android:id="@+id/actionState"
    android:layout_width="12dp"
    android:layout_height="12dp"
    android:layout_gravity="center_vertical"
    android:src="@drawable/check_lightgrey"
    android:layout_marginRight="5dp"/>

<TextView android:id="@+id/actionText"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    />

</LinearLayout>

在我的 res/drawable 文件夹中,我有两个文件 check_lightgrey.png 和 check_green.png。使用 ArrayAdapter 绘制 ListView,每个 ListItem 都由 check_lightgrey.png 和相应的文本组成,效果很好。

当用户点击一个 ListItem 时,我想将这个 ListItem 的 ImageView 的来源从 check_lightgrey.png 更改为 check_green.png

我的 ListActivity 中的 setOnItemClickListener 的代码如下所示:

ListView listView = getListView();
listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            ImageView imageView = (ImageView) v.findViewById(R.id.actionState);
            imageView.setImageResource(R.drawable.check_green);
        }
    });

只要列表没有太满以至于需要滚动,它就可以正常工作。如果有那么多ListItem需要滚动,那么点击一个ListItem时就会出现bug:不仅设置了点击的ListItem中ImageView的来源,而且还设置了不可见的ListItem的ImageView的来源,因为他们不在当前视图中。

这听起来有点混乱,但我举个例子:

  • 列表视图中有 56 个项目
  • 无需滚动即可看到前 13 个项目
  • 现在单击第 1 项 -> ImageView 的源更改为方面
  • 现在向下滚动之前不可见的第二个项目(项目 15)的 ImageView 的源也已更改
  • 第 29 项和第 43 项也是如此
  • 如您所见,始终存在 14 的差异

将设备的方向更改为横向时也会产生相同的效果。唯一改变的是 7 的差异。

我搜索了一个结论,但没有找到任何东西。因此,如果有人可以帮助我或给我提示,那就太好了。

问候

【问题讨论】:

    标签: android


    【解决方案1】:

    首先,这不是错误。发生这种情况是因为 ListView 试图回收视图以便更快。因此,为了更改其中一行的图像,您必须更改列表后面的数据,更新您的适配器并调用 notifyDataSetChanged。

    【讨论】:

    • 感谢您的回答。你是对的,这不是一个错误,这是我的错。我明白你的意思,这对我来说很有意义,但我不知道除了在我的 onItemClick 处理程序中调用 v.findViewById() 之外的另一种获取 ImageView 的方法。那么如何更改ImageView的来源呢?
    • 您使用的是哪种适配器? ArrayAdapter? CursorAdapter?自定义BaseAdapter?
    • 我将ArrayAdapter 用于保存我的TextData 的String[] 数组。但这只是构建和测试布局的第一个原型。在这个ListActivity 的最终版本中,每个ListItem 的TextView 的数据来自数据库中的CursorAdapter。但是ImageView 和上面的版本一样。创建一个扩展 ArrayAdapter 并覆盖 getView() 方法的自己的适配器会有所帮助吗?
    • 如果您使用的是数组适配器,那么值得您自己实现它并覆盖 getView 方法。另外,一旦您知道必须更改图像视图,就可以按照我在上面的答案中所写的操作。
    • 好的,目前我不在工作,所以我现在无法测试它。但我明天会试试,如果它有效,我会给出反馈。到目前为止感谢
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多