2016-08-20 9 views
0

私は、2ページのメイン、お気に入りを持つ1つのビューページを持っています。どちらもRecyclerViewsを持っていて、無限のスクロールで、15個のアイテムの後にサーバーから別の15個をロードします。私は、recyclerViewのアイテムをお気に入りに追加し、両方のrecyclerViewをリフレッシュするオプションを実装したいと思います。お気に入りに追加したり、追加された場合は削除したりすることができます。私はすでにこれを実装しており、完全に機能しています。アイテムを「お気に入り」として保存し、他のリサイクルビューに表示する

お気に入りのアイテムを追加すると、他のRecyclerViewがリフレッシュされないという問題があります。私は、お気に入りを追加または削除するたびに、他のフラグメントが再起動するので、サーバーから別のクエリを要求し、リサイクラビューでロードするというアイデアがありました。それはうまくいったが、あなたは常にトップに置かれていた。これは良いUXではない。アイテムを開いてそのアイテムに関する詳細情報を取得し、そのアイテムをそのアクティビティ内のお気に入りに追加することができます。だから、私がその活動から帰ってきたとき、あなたが好きなものにそれらを加えなかったのと同じように、すべて同じままだった。しかし、実際にあなたがしました。

私はこの問題を解決する方法がわかりません:/他のサーバーから別のクエリを要求し、RecylerViewの内部に読み込みます。私は無限のスクロールを実装していない場合、私はおそらく両側のアイテムを共有することができますが、無限のスクロールを持たなければならず、あまりにも多くのデータが無駄になります。

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

任意のアイデア、アドバイス、ソリューション

これはRecyclerViewのための私のアダプタがどのように見えるかですか?

答えて

1

私があなただったら、私は、次の手順を実行します。

1-お気に入り項目のId'sを保持するデータベースを作成します。お気に入りのButton上のクリックは、場合Databaseに存在していた場合、その後に新しい項目を追加

database.isFavoriteItems(Your_Items_ID); 

、3-:adapterチェックがかどうか、このようなものでデータベースに追加されたあなたのメインページでは

2 - 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-またシングルトンは本当にお勧めデータベースを作ります。

これらの手順では、問題は解決されます。

+0

これはスマートな解決策のようです。しかし、問題は、サーバーに2つのクエリがあることです。 1.ホーム用、2.お気に入り用。だからホームがロードされるときは何もしません。そしてお気に入りがロードされると、それらをデータベースに追加して、ボタンaddFavがクリックされたかどうかを確認してから、サーバーに送信してデータベースに保存します。これは私があなたの解決策から理解していることですが、そのアイテムをお気に入りのフラグメントに追加する方法や削除する方法はありますか? 'adapter.notifyDataSetChanged();'はフィードリストを更新するだけです。しかし、家庭用に1つ、お気に入り用に1つのフィードリストが2つあります。もし私が何を言っているのですか? :) – WinterChilly

+0

@WinterChillyお気に入りのフラグメントのadapter.notifyDataSetChanged()を呼び出します。 – Amir

+0

あなたの好みのアダプタの中であなたのシングルトンデータベースはあなたが望むものを正確に実行しました:) – Amir

関連する問題