在 ListView 中单击时,项目 ImageButton 可绘制更改似乎一次更改 2 个项目

Items ImageButton drawable change upon click in ListView seems to change for 2 items at a time

我知道之前有人问过这个问题,并且大致了解了发生的事情,但我似乎找不到解决方案。

在我的自定义列表适配器中和内部 public View getView(int position, View convertView, ViewGroup parent) { 我为项目 ImageButton 设置了点击功能。

final ImageButton bookmark = (ImageButton)
convertView.findViewById(R.id.bookmarkthis);
        bookmark.setTag(position);
        bookmark.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                bookmark.setImageResource(R.drawable.ic_bookmarked);
                bookmark.setTag(R.drawable.ic_bookmarked);

}

});

Imagebutton 是一颗透明的星形按钮,当单击它时,它会将同一个可绘制对象更改为黄色星形。没问题。

问题是当我单击位置 0 星形图标中的项目使其变为黄色时,它也会更改列表下方的项目 8,但尚未在视图中。如果我点击位置 1,位置 9 也会发生变化,依此类推。

我环顾四周并研究了这个问题,甚至尝试了 Imagebutton 的支架,但没有成功。某些东西阻止了 ImageButton 的可绘制更改到其正确的位置。

谢谢

解决方法是先在数组中为每个Item设置一个标志项。然后 onClick 仅针对该项目将标志设置为 true。然后在 getView 中,它只是一个 if 语句的例子,用于在项目被循环时检查标志。

//in array creation
items.setFlag("false");

//in getView as you set Text and what ever get the Flag state
String flag = m.getFlag();

 //check the flag state and take action in this case change the icon accordingly
 if (Objects.equals(flag, "true")) {
            bookmark.setImageResource(R.drawable.ic_bookmarked);
            bookmark.setTag(R.drawable.ic_bookmarked);
        }

        else {
            bookmark.setImageResource(R.drawable.ic_bookmark);
        }


// and in the click function
           @Override
                public void onClick(View v) {

                    bookmark.setImageResource(R.drawable.ic_bookmarked);
                    m.setFlag("true");

    }

您需要重置您的 bookmark 图像资源和标签值,一个非空的 convertView 被传递给 getView。您的 onClick 处理程序正在将它们设置为这些值:

bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);

因此您需要在显示新列表项时将它们重置为默认值。

ListView 重用超出范围的视图。重用视图时,您不会重置 "bookmark" 图标(当您获得非空 convertView 时)。确保始终将视图的所有属性重置为正确的值,这样就不会出现问题。