gridview中的第一项不会在AdapterView.OnItemClickListener

时间:2018-03-04 17:42:50

标签: android gridview onitemclicklistener android-adapterview

我有图像的网格视图。单击图像时,我设置了一个小的复选标记drawable以将其标记为已选中,当单击另一个项目时,我会检查所有项目并删除复选标记。

问题是网格视图中的第一个项目在检查后没有得到更新。检查后它根本不做任何事情。所有其他项目按预期工作 - 单击时检查它们,单击其他项目时取消选中。只有第一个项目在单击时保持选中状态,并且在单击其他项目时不会更改。

下面是onItemClickListener代码。有任何想法吗?

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);

编辑:添加更多代码以帮助理解该问题。这是我的适配器代码:

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;
    }
}

1 个答案:

答案 0 :(得分:1)

getView()登录时,您可能已经注意到此方法似乎至少被调用了position = 0两次。

您保留的ImageView数组来自getView(),但至少对于position = 0,您无法确定您在那里创建的ImageView是否会在事实上要添加到GridView

您可以做些什么来解决您的问题?一种选择是将 itemIds 保留为适配器的数据,而不是尝试自己管理ImageView。相反,适配器可以跟踪检查的位置,如下所示:

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;
    }
}

顺便说一句,实现ViewHolder模式可能是一个好主意,但我在这里跳过它以尽可能地保持代码。

您的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();
    }
});