在 android 的 RecyclerView 中保存 ToggleButton 的状态

Saving State of a ToggleButton in a RecyclerView in android

我有一个从 url 获取数据的 recyclerView,它输出 json 并使用 picasso 和其他一些数据加载图像。视图中的每个项目都有一个图像、名称、日期和一个 ToggleButton。

我为切换按钮实现了 setOnCheckedChangeListener,以将切换的图像添加到数据库中。

我想做的是,当用户关闭应用程序并再次打开它时,我希望之前切换并保存在数据库中的项目将其切换按钮设置为 true。

即使数据库中只有一个值,应用程序重新启动时也会激活多个切换按钮。

如何避免这种情况以及是否有更好的方法来实现这种情况?

注意:这里只添加了部分代码

@Override
public void onBindViewHolder(final ImagesViewHolder imagesViewHolder, final int position) {
    imagesViewHolder.toggleFavorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                database.saveLiked(currentImage, mScreenWidth);                            
            } else {
                // The toggle is disabled
            }
        }
    });

    for (Image image : database.getAllData()) {
        if (image.getUrl().equals(currentImage.getUrl())) {
            imagesViewHolder.toggleFavorite.setChecked(true);
            break;
        }
    } 
}

saveLiked 方法

public void saveLiked(Image currentImage,int mScreenWidth) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(KEY_IMAGE_CATNAME, currentImage.getAuthor());
    values.put(KEY_IMAGE_URL, currentImage.getUrl());

    // Inserting Row
    db.insert(TABLE_NAME, null, values);
    db.close(); // Closing database connection
}

您不仅应该打开,还应该关闭。 IE。尝试改变这个

for (Image image: database.getAllData()) {
    if (image.getUrl().equals(currentImage.getUrl())) {
        imagesViewHolder.toggleFavorite.setChecked(true);
        break;
    }
}

至此

// unchecked by default, unless proven checked below
imagesViewHolder.toggleFavorite.setChecked(false);
for (Image image: database.getAllData()) {
    if (image.getUrl().equals(currentImage.getUrl())) {
        imagesViewHolder.toggleFavorite.setChecked(true);
        break;
    }
}

RecyclerView 通过将新数据绑定到视图来重用视图,您的问题可能会显现,因为 RV 会重新使用之前切换过按钮的视图,并且您在重新绑定到新数据时不会重置它们的 'toggled' 状态。