将项目保存为 "Favorite" 并在其他回收站视图中显示
Saving an item as "Favorite" and showing it across other recyclerviews
我有 1 个 viewpager,其中有 2 个主要页面、收藏夹。两者都有 RecyclerViews,无限滚动,在 15 个项目之后它从服务器加载另外 15 个等等。我想实现一个选项,将 recyclerView 中的项目添加到收藏夹并刷新两个 recyclerView。如果添加了它们,我可以将它们添加到收藏夹或删除它们。我已经实现了这个并且它工作得很好。
问题是,如果我将项目添加到收藏夹,它不会刷新其他 RecyclerView。我有一个想法,每次我从收藏夹中添加或删除时,另一个片段都会重新启动,因此它会从服务器请求另一个查询,而您只需将它们加载到回收器视图中即可。它有效,但你总是被放在最前面,这不是一个好的用户体验。您可以打开项目并获取有关该项目的更多信息,并且可以将它们添加到 activity 内的收藏夹中。所以当我从那个 activity 回来时,一切都保持不变,就像你没有将它们添加到收藏夹一样。但实际上你做到了。
我不知道如何解决这个问题:/其他人从服务器询问另一个查询,并将其加载到 RecylerView 中。如果我没有实现无限滚动我可能可以共享两边的项目,但我必须有无限滚动,太多的数据会被浪费。
这是我的 RecyclerView 适配器的样子:
customViewHolder.llLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String fontAwesomeFullHeart = mContext.getString(R.string.fa_heart);
final String getLikeText = customViewHolder.tvPicLike.getText().toString();
if (getLikeText == fontAwesomeFullHeart) {
MyFunctions.showNotToFavoriteHeart(mContext, customViewHolder.tvPicLike, customViewHolder.tvLike);
API_Network_Service.serverRemoveFromFavorites(mContext, feedItem.getId(), logged_in, customViewHolder.tvPicLike);
} else {
MyFunctions.showFavoriteHeart(mContext, customViewHolder.tvPicLike, customViewHolder.tvLike);
API_Network_Service.serverAddToFavorites(mContext, feedItem.getId(), logged_in, customViewHolder.tvPicLike);
}
}
});
这是来自 API_SERVICE_CLASS:
public static void serverAddToFavorites(final Context mContext, String apartment_id, RealmUser_Personal user, final TextView tvLike) {
String user_id = user.getId();
HashMap<String, String> map = new HashMap<>();
map.put("user_id", user_id);
HashMap<String, Object> mapMeta = new HashMap<>();
mapMeta.put("meta", map);
mapMeta.put("entry_id", apartment_id);
final ApiUporabnik apiService = ApiClient.getAPIUser().create(ApiUporabnik.class);
Call<FavoriteAdd> saveFavorite = apiService.favoriteAdd(API_KEY, mapMeta);
saveFavorite.enqueue(new Callback<FavoriteAdd>() {
@Override
public void onResponse(Call<FavoriteAdd> call, Response<FavoriteAdd> response) {
Log.d("Saved FAV", "");
//TODO Refresh item everywhere
}
@Override
public void onFailure(Call<FavoriteAdd> call, Throwable t) {
Log.e("E: Failed FAV", t.toString());
tvLike.setText(mContext.getString(R.string.fa_heart_o));
}
});
}
有什么想法、建议、解决方案吗?
如果我是你,我会执行以下步骤:
1- 创建一个数据库,其中包含 Id's
个最喜欢的项目。
2- 在您的主页中 adapter
检查是否添加到数据库中,如下所示:
database.isFavoriteItems(Your_Items_ID);
3- 单击收藏夹 Button
时,如果 Not 存在于 Database
中,则将新项目添加到 Database
,如果之前添加过删除它。
if(database.isFavoriteItem(Your_Items_ID)){
database.addToFavorite(Your_Items_ID);
} else {
database.removeFromFavorite(Your_Items_ID);
}
4-当你在片段调用notifyDataSetChanged
里面滚动到收藏夹列表时:
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible){
adapter.notifyDataSetChanged();
}
}
5- 也让你的数据库Singleton 真心推荐。
通过这些步骤,您的问题将得到解决。
我有 1 个 viewpager,其中有 2 个主要页面、收藏夹。两者都有 RecyclerViews,无限滚动,在 15 个项目之后它从服务器加载另外 15 个等等。我想实现一个选项,将 recyclerView 中的项目添加到收藏夹并刷新两个 recyclerView。如果添加了它们,我可以将它们添加到收藏夹或删除它们。我已经实现了这个并且它工作得很好。
问题是,如果我将项目添加到收藏夹,它不会刷新其他 RecyclerView。我有一个想法,每次我从收藏夹中添加或删除时,另一个片段都会重新启动,因此它会从服务器请求另一个查询,而您只需将它们加载到回收器视图中即可。它有效,但你总是被放在最前面,这不是一个好的用户体验。您可以打开项目并获取有关该项目的更多信息,并且可以将它们添加到 activity 内的收藏夹中。所以当我从那个 activity 回来时,一切都保持不变,就像你没有将它们添加到收藏夹一样。但实际上你做到了。
我不知道如何解决这个问题:/其他人从服务器询问另一个查询,并将其加载到 RecylerView 中。如果我没有实现无限滚动我可能可以共享两边的项目,但我必须有无限滚动,太多的数据会被浪费。
这是我的 RecyclerView 适配器的样子:
customViewHolder.llLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String fontAwesomeFullHeart = mContext.getString(R.string.fa_heart);
final String getLikeText = customViewHolder.tvPicLike.getText().toString();
if (getLikeText == fontAwesomeFullHeart) {
MyFunctions.showNotToFavoriteHeart(mContext, customViewHolder.tvPicLike, customViewHolder.tvLike);
API_Network_Service.serverRemoveFromFavorites(mContext, feedItem.getId(), logged_in, customViewHolder.tvPicLike);
} else {
MyFunctions.showFavoriteHeart(mContext, customViewHolder.tvPicLike, customViewHolder.tvLike);
API_Network_Service.serverAddToFavorites(mContext, feedItem.getId(), logged_in, customViewHolder.tvPicLike);
}
}
});
这是来自 API_SERVICE_CLASS:
public static void serverAddToFavorites(final Context mContext, String apartment_id, RealmUser_Personal user, final TextView tvLike) {
String user_id = user.getId();
HashMap<String, String> map = new HashMap<>();
map.put("user_id", user_id);
HashMap<String, Object> mapMeta = new HashMap<>();
mapMeta.put("meta", map);
mapMeta.put("entry_id", apartment_id);
final ApiUporabnik apiService = ApiClient.getAPIUser().create(ApiUporabnik.class);
Call<FavoriteAdd> saveFavorite = apiService.favoriteAdd(API_KEY, mapMeta);
saveFavorite.enqueue(new Callback<FavoriteAdd>() {
@Override
public void onResponse(Call<FavoriteAdd> call, Response<FavoriteAdd> response) {
Log.d("Saved FAV", "");
//TODO Refresh item everywhere
}
@Override
public void onFailure(Call<FavoriteAdd> call, Throwable t) {
Log.e("E: Failed FAV", t.toString());
tvLike.setText(mContext.getString(R.string.fa_heart_o));
}
});
}
有什么想法、建议、解决方案吗?
如果我是你,我会执行以下步骤:
1- 创建一个数据库,其中包含 Id's
个最喜欢的项目。
2- 在您的主页中 adapter
检查是否添加到数据库中,如下所示:
database.isFavoriteItems(Your_Items_ID);
3- 单击收藏夹 Button
时,如果 Not 存在于 Database
中,则将新项目添加到 Database
,如果之前添加过删除它。
if(database.isFavoriteItem(Your_Items_ID)){
database.addToFavorite(Your_Items_ID);
} else {
database.removeFromFavorite(Your_Items_ID);
}
4-当你在片段调用notifyDataSetChanged
里面滚动到收藏夹列表时:
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible){
adapter.notifyDataSetChanged();
}
}
5- 也让你的数据库Singleton 真心推荐。
通过这些步骤,您的问题将得到解决。