複数のアイテムの選択をサポートする画像のギャラリーを実装しています。メイン レイアウトは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