简体   繁体   English

gridview 中的第一项在 AdapterView.OnItemClickListener 中没有改变

[英]First item in gridview does not change in the AdapterView.OnItemClickListener

I have a grid view of images.我有图像的网格视图。 When click on an image I set a little check mark drawable to mark it as selected, and when another item is clicked I go through all items and remove the check mark.单击图像时,我设置了一个可绘制的小复选标记以将其标记为已选中,当单击另一个项目时,我会浏览所有项目并删除复选标记。

The problem is my first item in the grid view does not get updated after it is checked.问题是我在网格视图中的第一个项目在检查后没有更新。 It simply does not do anything after it is checked.它在检查后根本不做任何事情。 All other items work as expected - they get checked when clicked and unchecked when another item is clicked.所有其他项目都按预期工作 - 单击时会选中它们,单击另一个项目时会取消选中它们。 Only the first item stays checked when it is clicked and does not change when other items are clicked.只有第一个项目在单击时保持选中状态,并且在单击其他项目时不会改变。

Below is the onItemClickListener code.下面是 onItemClickListener 代码。 Any ideas?有任何想法吗?

for (int i = 0; i < shapeIds.length; i++) {
    ImageView imageView = (ImageView) adapterView.getItemAtPosition(i);
    imageView.setImageDrawable(null); // does not work on item 0
}

Drawable check = VectorDrawableCompat.create(getResources(), R.drawable.check_circle, null);
((ImageView) view).setImageDrawable(check);

EDIT: Adding more code to help understand the issue.编辑:添加更多代码以帮助理解问题。 Here is my adapter code:这是我的适配器代码:

public class ImageAdapter extends BaseAdapter {

    private Context context;
    private ImageView imageView;
    private int[] itemIds;
    private ImageView[] views;

    ImageAdapter(Context c, int[] itemIds) {
        context = c;
        this.itemIds = itemIds;
        views = new ImageView[itemIds.length];
    }

    @Override
    public int getCount() {
        return itemIds.length;
    }

    @Override
    public Object getItem(int position) {
        return views[position];
    }

    @Override
    public long getItemId(int position) {
        return itemIds[position];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {

        imageView = new ImageView(context);
        Drawable mainDrawable = VectorDrawableCompat.create(getResources(), itemIds[position], null);
        imageView.setBackground(mainDrawable);
        views[position] = imageView;
        return imageView;
    }
}

When logging from getView() , you may have noticed that this method seems to get called at least twice for position=0.getView()登录时,您可能已经注意到,对于 position=0,此方法似乎至少被调用了两次。

You are keeping an array of ImageView s which is populated from getView() , but at least for position=0 you can't be sure that the ImageView you create there will in fact be added to the GridView .您保留了一个从getView()填充的ImageView数组,但至少对于 position=0 您不能确定您在那里创建的ImageView实际上会添加到GridView

What can you do to solve your issue?你能做些什么来解决你的问题? One option is to keep itemIds as the Adapter's data and not try to manage the ImageView s yourself.一种选择是将itemIds保留为 Adapter 的数据,而不是尝试自己管理ImageView Instead, the Adapter could keep track of the checked position like this:相反,适配器可以像这样跟踪检查的位置:

public class ImageAdapter extends BaseAdapter {

    private Context context;
    private ImageView imageView;
    private int[] itemIds;
    private int checkedPosition = -1;
    private Drawable check;

    ImageAdapter(Context c, int[] itemIds) {
        context = c;
        check = VectorDrawableCompat.create(context.getResources(), R.drawable.ic_check_circle, null);
        this.itemIds = itemIds;
    }

    public void setCheckedPosition(int checkedPosition){
        this.checkedPosition = checkedPosition;
    }

    @Override
    public int getCount() {
        return itemIds.length;
    }

    @Override
    public Object getItem(int position) {
        return itemIds[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {

        imageView = new ImageView(context);
        Drawable mainDrawable = VectorDrawableCompat.create(getResources(), itemIds[position], null);
        imageView.setBackground(mainDrawable);
        if(checkedPosition == position){

            imageView.setImageDrawable(check);
        }
        else{
            imageView.setImageDrawable(null);
        }
        return imageView;
    }
}

BTW it may be a good idea to implement the ViewHolder pattern, but I'm skipping this here to stay as close as possible to your code.顺便说一句,实现 ViewHolder 模式可能是个好主意,但我在这里跳过这个以尽可能接近您的代码。

Your OnItemClickListener would look as follows:您的 OnItemClickListener 如下所示:

final ImageAdapter adapter = new ImageAdapter(this, shapeIds);
gridView.setAdapter(adapter);

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        adapter.setCheckedPosition(position);
        adapter.notifyDataSetChanged();
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM