1

複数のアイテムの選択をサポートする画像のギャラリーを実装しています。メイン レイアウトはGridView、カスタム を使用する ですAdapter。表示されている項目はすべてImageView+の組み合わせCheckBoxです。いくつかのチェックボックスがオンになっている場合は、GridView. notifyDataSetChanged()この機能の実装を呼びかけています。残念ながら、この「すべてのチェックを外す」機能は機能しません。私はまだ初心者なので、おそらく私が理解していない基本的なことがあります。誰かが私の何が悪いのか教えてもらえますAdapterか? ありがとう。

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    // References to our images
    public Integer[] mThumbIds = {
            R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3
    };

    // The layout inflater used to retrieve gallery children layouts
    private LayoutInflater mInflater;

    // Array used to update checkboxes
    public boolean[] checkboxesState = new boolean[getCount()];

    public ImageAdapter(Context c) {
        mContext = c;
        mInflater = (LayoutInflater) 
                c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // Define the initial checked/unchecked state of the checkboxes
        for(int i = 0; i < getCount(); i++) {
            checkboxesState[i] = false;
        }
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

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

    /* Create a new View for each cell displayed in the GridView.
     * In our case a View is an instance of RelativeLayout from which
     * we can extract the image and checkbox to be displayed in the cell
     */
    public View getView(int position, View convertView, ViewGroup parent) {
        View cell = convertView;
        if (cell == null) {
            // No View passed, create one.
            cell = mInflater.inflate(R.layout.galleryitem, null);
            // Setup the View content
            ImageView imageView = (ImageView)cell.findViewById(R.id.thumbImage);
            CheckBox checkBox = (CheckBox) cell.findViewById(R.id.itemCheckBox);
            checkBox.setChecked(checkboxesState[position]);
            checkBox.setId(position);
            imageView.setImageBitmap(downsample(mThumbIds[position]));

            // Setup the View behavior
            imageView.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    // Uncheck all checked items
                    uncheckAll();
                }
            });

            checkBox.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    checkboxesState[cb.getId()] = cb.isChecked();
                }
            });
        }
        return cell;
    }

    private Bitmap downsample(int resId){
        // Some code here
    }

    private void uncheckAll() {
        // This code does not work. GridView is not refreshed
        for(int i = 0; i < checkboxesState.length; i++) {
            checkboxesState[i] = false;
        }
        notifyDataSetChanged();
    }
}

アップデート

私の最初の投稿では、uncheckAll メソッドがどのように失敗するかを正確に説明していないことに気付きました。N 個のチェックボックスをチェックして uncheckAll メソッドを呼び出すと、次のようになります。

  • 最初にチェックされたチェックボックスはチェックされていません
  • N個のチェックボックスの新しいグループがチェックされます

この動作により、グリッドビュー アイテムが予想外に 内の位置を変更しているのではないかと考えたので、すべてのアイテムに一意の名前GridViewの を追加しました。TextView私の考えは正しかった: 画面をスクロールすると、アイテムの位置がGridView. uncheckAll が呼び出されたときも同じことが起こります。私はこのスレッドで私のために働く解決策を見つけました。

注: 開発のこの段階では、すべてのアイテムに同じImageViewリソースを使用していたため、移動の問題について最初は気づきませんでした。GridView

4

1 に答える 1

1

この問題は、ほとんどの場合、getView() メソッドが新しいセル ビューを正しく初期化しますが、再利用されたセル ビューの状態を更新しないことが原因です。したがって、基本的に各セル ビューには、初期化された状態のみが表示されます。次のようになります。

public View getView(int position, View convertView, ViewGroup parent) {
    View cell = convertView;

    if (cell == null) {
        // No View passed, create one.
        cell = mInflater.inflate(R.layout.galleryitem, null);
        // Setup the View content
        ImageView imageView = (ImageView)cell.findViewById(R.id.thumbImage);
        CheckBox checkBox = (CheckBox) cell.findViewById(R.id.itemCheckBox);
        checkBox.setChecked(checkboxesState[position]);
        checkBox.setId(position);
        imageView.setImageBitmap(downsample(mThumbIds[position]));

        // Setup the View behavior
        imageView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // Uncheck all checked items
                uncheckAll();
            }
        });

        checkBox.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v;
                checkboxesState[cb.getId()] = cb.isChecked();
            }
        });
    } else {
        ImageView imageView = (ImageView)cell.findViewById(R.id.thumbImage);
        CheckBox checkBox = (CheckBox) cell.findViewById(R.id.itemCheckBox);
        checkBox.setChecked(checkboxesState[position]);
        checkBox.setId(position);
        imageView.setImageBitmap(downsample(mThumbIds[position]));
    }

    return cell;
}

さらに、 getView() メソッドのパフォーマンスを改善するには、このチュートリアルをご覧ください。

于 2012-08-06T23:20:30.453 に答える