Search code examples
androidgridviewandroid-viewbaseadapter

How to keep View state inside GridView Adapter?


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


Solution

  • 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.