在 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' 状态。
我有一个从 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' 状态。