I'm trying to make gallery of pictures from different rooms/places. Those are tagged by id and I want to show them on different Grids (same GridView but I'm just changing dataset and call notifyDataSetChanged()
). Also single item has CheckBox
which user can check (but only one per grid) and then he can go to next "page" with new data set. But at the next page same CheckBox
is already checked or while pressing "previous" it's not checked or both are checked or other messed up situations. I've tried lots of solutions: keeping table of those check boxes, keeping their ID's, keeping previously checked CheckBox
and that's not all but nothing works.
Here's my code:
Adapter:
public class GalleryGridAdapter extends BaseAdapter {
private Context context;
private ArrayList<PhotosPOJO> galleryList;
private static String[] checkTab;
private static int[] checkBoxNumberTab;
//private static int[] selectedTab;
//private static CheckBox prevSelected;
private int roomNumber;
public GalleryGridAdapter(Context context, ArrayList<PhotosPOJO> list) {
this.context = context;
this.galleryList = list;
//prevSelected = null;
checkTab = new String[12];
checkBoxNumberTab = new int[12];
//selectedTab = new int[12];
for (int i = 0; i < 12; i++) {
checkTab[i] = null;
checkBoxNumberTab[i] = -1;
//selectedTab[i] = NO_ID;
}
}
public void setRoomNumber(int roomNumber) {
this.roomNumber = roomNumber;
}
@Override
public int getCount() {
return galleryList.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, final ViewGroup viewGroup) {
final String photo = galleryList.get(i).getAbsolutePath();
if (view == null) {
final LayoutInflater layoutInflater = LayoutInflater.from(context);
view = layoutInflater.inflate(R.layout.grid_item_gallery, null);
}
final PhotoView photoView = (PhotoView) view.findViewById(R.id.gallery_photo_view);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.gallery_checkbox);
final ImageView ivTrash = (ImageView) view.findViewById(R.id.gallery_iv_trash);
checkBox.bringToFront();
ivTrash.bringToFront();
Glide.with(context)
.load(photo)
.into(photoView);
ivTrash.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_restore_from_trash));
for (int k = 0; k < viewGroup.getChildCount(); k++) {
if (viewGroup.getChildAt(k) instanceof CheckBox) {
((CheckBox) viewGroup.getChildAt(k)).setChecked(false);
}
}
if (checkBoxNumberTab[roomNumber] != -1) {
((CheckBox) viewGroup.getChildAt(checkBoxNumberTab[roomNumber]).findViewById(R.id.gallery_checkbox)).setChecked(true);
}
/*checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (prevSelected != null) {
prevSelected.setChecked(false);
((CheckBox) view).setChecked(true);
prevSelected = (CheckBox) view;
checkTab[roomNumber] = photo;
} else {
((CheckBox) view).setChecked(true);
prevSelected = (CheckBox) view;
}
}
});*/
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b) {
if (checkTab[roomNumber] != null) {
//prevSelected.setChecked(false);
for (int k = 0; k < viewGroup.getChildCount(); k++) {
if (compoundButton == viewGroup.getChildAt(k)) {
checkBoxNumberTab[roomNumber] = k;
}
}
compoundButton.setChecked(true);
//selectedTab[roomNumber] = compoundButton.getId();
//prevSelected = (CheckBox)compoundButton;
checkTab[roomNumber] = photo;
} else {
compoundButton.setChecked(true);
checkTab[roomNumber] = photo;
//selectedTab[roomNumber] = compoundButton.getId();
//prevSelected = (CheckBox)compoundButton;
}
} else {
checkTab[roomNumber] = null;
checkBoxNumberTab[roomNumber] = -1;
//selectedTab[roomNumber] = NO_ID;
//prevSelected = null;
}
}
});
ivTrash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
galleryList.remove(i);
notifyDataSetChanged();
}
});
return view;
}
public void setData(ArrayList<PhotosPOJO> newPhotos) {
this.galleryList = newPhotos;
notifyDataSetChanged();
}
//public int[] getTabValue(int roomNumber) {
// return checkTab;
//}
}
Creating GridView:
gv = (GridView) findViewById(R.id.galleryGridView); // my GridView
galleryAdapter = new GalleryGridAdapter(this, galleryList);
galleryAdapter.setRoomNumber(roomNumber);
gv.setAdapter(galleryAdapter);
Updating Grid:
private void updateView() {
galleryList = new ArrayList<>();
galleryList = dbPhotos.getPhotosByRoom(roomNumber);
galleryAdapter.setData(galleryList);
galleryAdapter.setRoomNumber(roomNumber);
Toast.makeText(GalleryActivity.this, String.valueOf(roomNumber), Toast.LENGTH_SHORT).show();
}
Calling method: (for update)
private void setListeners() {
fabLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (roomNumber > 0) {
--roomNumber;
fabRight.show();
}
if (roomNumber == 0) {
fabLeft.hide();
} else {
fabLeft.show();
}
updateView();
}
});
fabRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (roomNumber < 11) {
++roomNumber;
fabLeft.show();
}
if (roomNumber == 11) {
fabRight.hide();
} else {
fabRight.show();
}
updateView();
}
});
}
I'm stuck here. Maybe I'm missing something but I really do not know how to resolve this
Okay,
So I've resolved this by using SharedPreferences
. I am saving position
of CheckBox
using prefs key "RoomNumber" + roomNumber
and then I'm reading it depending on roomNumber. Thanks to SharedPreferences
works even after app is closed.