Java Listview中的Android Imageview onClick change image不';我不能正常工作

Java Listview中的Android Imageview onClick change image不';我不能正常工作,java,android,android-listview,imageview,android-arrayadapter,Java,Android,Android Listview,Imageview,Android Arrayadapter,我有一个ListView,在每个ListviewItem中都有一个带有小星星的ImageView(用于将其标记为收藏夹)。因此,我在自定义ArrayAdapter中的每个项上都为ImageView放置了一个OnClickListener imgStar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Bitmap bitma

我有一个ListView,在每个ListviewItem中都有一个带有小星星的ImageView(用于将其标记为收藏夹)。因此,我在自定义ArrayAdapter中的每个项上都为ImageView放置了一个OnClickListener

imgStar.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Bitmap bitmap = ((BitmapDrawable)imgStar.getDrawable()).getBitmap();
            Bitmap bitmap2 = ((BitmapDrawable)(context.getResources().getDrawable(R.drawable.ic_action_not_important))).getBitmap();

            if(bitmap != bitmap2) {
                    imgStar.setImageResource(R.drawable.ic_action_not_important);
            } else {
                    imgStar.setImageResource(R.drawable.ic_action_important);
            }
        }
    });
问题是:当我得到一些项目,并点击第一个项目的星,例如,图像改变,因为它应该,但一些项目降低图像的变化也 我用一些代码对它进行了测试:我脑子里想不到的是,它只是在更改图像(在下面的另一个项目上),在onclick中执行的代码只在我真正单击的项目上执行,而不是在图像也发生更改的项目上执行

为什么列表中其他随机项目的图像也会发生变化?我希望有人能帮助我

自定义适配器构造函数代码

public LinkArrayAdapter(Context con, int textViewResourceId) {
    super(con, textViewResourceId);
    context = con;

}

主要的问题是,你不能在点击
onClick
时更改项目的图像,然后离开它,希望列表中的每个项目都能更新它。因为
onClick
在与
getView
不同的时间被调用。因此,您必须在
onClick
之外,但在
getView
中设置项目图像,以便每次
getView
调用特定项目时,它都会为该项目设置适当的图像

将CustomAdapter类中的布尔数组定义为:

private boolean[] stars;
然后在类的构造函数方法中,将其初始化为:

this.stars = new boolean[items.size()];
onClick
方法中:

// **Edited to apply image update at click**
stars[position] = !stars[position];
notifyDataSetInvalidated();
最后在自定义适配器的
getView()
方法中 (确保此代码不在任何其他内部块中):


@然而,塞姆萨莫特的答案是有效的
notifyDataSetInvalidated()
使列表重新加载并转到第一项。
改用
notifyDataSetChanged()

此代码是否在自定义适配器中?是的,此代码位于自定义适配器中(在getView事件中)这是添加到列表视图中的。单击星图时,您需要随机更改图像。对吗?您需要在数组中存储单击位置的位置,并检查项目位置是否在数组中。不,这正是我想要的:D我只想在我真正单击的imageview中更改图像,不是在下面的项目的图像视图中,我从未单击过。在构造函数中,我没有
项目
变量。那么,您传递给适配器的数据类型是什么,适配器类中的变量名是什么?我通过类“OneComment”传递它,数据是不同的字符串。在OneComment构造函数中,我将其设置为
this.link=link
,在适配器中,我调用
OneComment=getItem(position)
,然后我可以使用
comment.link
之类的数据作为链接,例如,请在问题中添加自定义适配器构造函数代码对不起,我猜不出您的数据数组在哪里。但它必须是数组或ArrayList,因为您有一个列表视图,所以您有一个数据列表,并且它具有指定的大小。您必须将“stars”布尔数组大小设置为该大小。我单击第一个项目的星,它会被添加,但在第七个项目上它也会被添加,问题与以前相同:/n您只想要一个从整个列表开始的项目,对吗?确切地说,带星的项目应该与我单击该星的imageview的项目完全相同(我认为这几乎类似于gmail应用程序将电子邮件标记为收藏夹)对不起,这仍然不起作用。它总是树立了另一个我从未点击过的明星:(编辑:现在有了一个有效的解决方案(见上文),但仍然给了你投票支持你的想法和帮助!:)谢谢
if (stars[position])
  imgStar.setImageResource(R.drawable.ic_action_important);
else
  imgStar.setImageResource(R.drawable.ic_action_not_important);
    private int  selectedPositions ;

    // /... your code.
            convertView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    OneComment mComment = mlist.get(position);
                    mComment.isStart = !mComment.isStart;
                    if(mComment.isStar){
//set star image
} else{
do not set star image}

                }
            });