簡體   English   中英

gridview 中的第一項在 AdapterView.OnItemClickListener 中沒有改變

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

我有圖像的網格視圖。 單擊圖像時,我設置了一個可繪制的小復選標記以將其標記為已選中,當單擊另一個項目時,我會瀏覽所有項目並刪除復選標記。

問題是我在網格視圖中的第一個項目在檢查后沒有更新。 它在檢查后根本不做任何事情。 所有其他項目都按預期工作 - 單擊時會選中它們,單擊另一個項目時會取消選中它們。 只有第一個項目在單擊時保持選中狀態,並且在單擊其他項目時不會改變。

下面是 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;
    }
}

getView()登錄時,您可能已經注意到,對於 position=0,此方法似乎至少被調用了兩次。

您保留了一個從getView()填充的ImageView數組,但至少對於 position=0 您不能確定您在那里創建的ImageView實際上會添加到GridView

你能做些什么來解決你的問題? 一種選擇是將itemIds保留為 Adapter 的數據,而不是嘗試自己管理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();
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM