如何在网格视图适配器中保持视图状态?



我正在尝试制作来自不同房间/地方的图片库。这些由id标记,我想在不同的网格上显示它们(相同的GridView,但我只是更改数据集并调用notifyDataSetChanged()(。此外,单个项目具有CheckBox用户可以检查的(但每个网格只有一个(,然后他可以使用新数据集转到下一个"页面"。但是在下一页中,已经检查了相同的CheckBox,或者在按"上一个"时未选中,或者两者都被选中或其他混乱的情况。我已经尝试了很多解决方案:保留这些复选框的表,保留它们的ID,保持以前选中的CheckBox,这还不是全部,但没有任何效果。
这是我的代码:适配器:

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;
    //}
}


创建网格视图:

gv = (GridView) findViewById(R.id.galleryGridView);  // my GridView
        galleryAdapter = new GalleryGridAdapter(this, galleryList);
        galleryAdapter.setRoomNumber(roomNumber);
        gv.setAdapter(galleryAdapter);


更新网格:

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();
    }


调用方法:(用于更新(

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();
           }
       });
   }

我被困在这里。也许我错过了一些东西,但我真的不知道如何解决这个问题

好的,
所以我通过使用SharedPreferences解决了这个问题。我正在使用首选项键"RoomNumber" + roomNumber保存position CheckBox,然后根据roomNumber进行阅读。多亏了SharedPreferences即使在应用程序关闭后也能正常工作。

最新更新