diff --git a/app/src/main/java/com/example/citrusclient/rest/BooksRest.java b/app/src/main/java/com/example/citrusclient/rest/BooksRest.java index 0119071..b4500c9 100644 --- a/app/src/main/java/com/example/citrusclient/rest/BooksRest.java +++ b/app/src/main/java/com/example/citrusclient/rest/BooksRest.java @@ -95,13 +95,13 @@ @Field("token") String token ); - @PUT("/{account_id}/books/{book_id}/registerFavoriteCount") + @PUT("accounts/{account_id}/books/{book_id}/registerFavoriteCount") Call registerFavoriteCount( @Path("account_id") String account_id, @Path("book_id") Integer book_id ); - @PUT("/{account_id}/books/{book_id}/unregisterFavoriteCount") + @PUT("accounts/{account_id}/books/{book_id}/unregisterFavoriteCount") Call unregisterFavoriteCount( @Path("account_id") String account_id, @Path("book_id") Integer book_id diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java index ea47647..8a16215 100644 --- a/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java +++ b/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java @@ -6,6 +6,7 @@ import com.example.citrusclient.models.Book; import com.example.citrusclient.rest.BooksRest; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -201,7 +202,7 @@ if (response.isSuccessful()){ System.out.println("Success registerFavorited"); } else { - System.out.println("response error"); + System.out.println(response.code()); } } @@ -221,7 +222,7 @@ if (response.isSuccessful()){ System.out.println("Success unresterFavorited"); } else { - System.out.println("response error"); + System.out.println("response errora"); } } diff --git a/app/src/main/java/com/example/citrusclient/views/MyAdapter.java b/app/src/main/java/com/example/citrusclient/views/MyAdapter.java index ae0198f..a829609 100644 --- a/app/src/main/java/com/example/citrusclient/views/MyAdapter.java +++ b/app/src/main/java/com/example/citrusclient/views/MyAdapter.java @@ -14,6 +14,7 @@ import com.example.citrusclient.Citrus; import com.example.citrusclient.R; import com.example.citrusclient.models.Book; +import com.example.citrusclient.viewmodels.BooksViewModel; import com.example.citrusclient.viewmodels.FavoritesViewModel; import java.util.ArrayList; @@ -21,6 +22,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.ResourceBundle; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; @@ -31,6 +33,7 @@ private List originalList; // 元のデータリスト private List filteredList; // フィルタリングされたリスト private HashMap> favoritesMap = new HashMap<>(); + private HashSet favoritedMap; public MyAdapter(List originalList) { @@ -52,6 +55,7 @@ Context context = holder.itemView.getContext(); Activity activity = (Activity) context; Citrus citrus = (Citrus) activity.getApplication(); + BooksViewModel booksViewModel = new ViewModelProvider((FragmentActivity)context).get(BooksViewModel.class); FavoritesViewModel favoritesViewModel = new ViewModelProvider((FragmentActivity)context).get(FavoritesViewModel.class); // 背景色の設定 @@ -74,23 +78,28 @@ citrus.setCurDay(calendar.get(Calendar.DATE)); ((MainActivity) activity).showFragment(new OtherHomeFragment()); }); -// if (favoritesMap != null && favoritesMap.containsKey(currentBook.getAccountId())) { -// if (favoritesMap.get(currentBook.getAccountId()).contains(currentBook.getBookId())) { -// holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_24); -// holder.LikeTextView.setTag("liked"); -// } else { -// holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24); -// holder.LikeTextView.setTag("unliked"); -// } -// } else { -// holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24); -// holder.LikeTextView.setTag("unliked"); -// } + + if (favoritesMap != null && favoritesMap.containsKey(currentBook.getAccountId())) { + if (favoritesMap.get(currentBook.getAccountId()).contains(currentBook.getBookId())) { + holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_24); + holder.LikeTextView.setTag("liked"); + } else { + holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24); + holder.LikeTextView.setTag("unliked"); + } + } else { + holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24); + holder.LikeTextView.setTag("unliked"); + } holder.LikeTextView.setOnClickListener(view -> { System.out.println(holder.LikeTextView.getTag()); if(holder.LikeTextView.getTag().equals("unliked")){ System.out.println(citrus.getAccountId()+"が"+currentBook.getAccountId()+"の"+currentBook.getBookId()+"を登録しました"); + + booksViewModel.registerFavoriteCount(currentBook.getAccountId(), currentBook.getBookId()); + holder.LikedCountTextView.setText(context.getString(R.string.liked_count_format, currentBook.getFavoritedCount())); + favoritesViewModel.setFavorite(currentBook.getAccountId(), currentBook.getBookId(), citrus.getAccountId(), citrus.getToken()); holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_24); Animation animation = AnimationUtils.loadAnimation(holder.itemView.getContext(),R.anim.touch); @@ -98,6 +107,8 @@ holder.LikeTextView.setTag("liked"); }else if(holder.LikeTextView.getTag().equals("liked")){ System.out.println(citrus.getAccountId()+"が"+currentBook.getAccountId()+"の"+currentBook.getBookId()+"を解除しました"); + booksViewModel.unregisterFavoriteCount(currentBook.getAccountId(), currentBook.getBookId()); + holder.LikedCountTextView.setText(context.getString(R.string.liked_count_format, currentBook.getFavoritedCount())); favoritesViewModel.deletefavorite(currentBook.getAccountId(), currentBook.getBookId(), citrus.getAccountId(), citrus.getToken()); holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24); holder.LikeTextView.setTag("unliked"); @@ -139,10 +150,16 @@ notifyDataSetChanged(); } + public void updateFavorited(HashSet likedBooksCount) { + this.favoritedMap = likedBooksCount; + notifyDataSetChanged(); // アダプターを更新 + } + static class ViewHolder extends RecyclerView.ViewHolder { TextView titleTextView; TextView authorTextView; ImageButton LikeTextView; + TextView LikedCountTextView; ViewHolder(View itemView) { @@ -150,12 +167,14 @@ titleTextView = itemView.findViewById(R.id.public_button); authorTextView = itemView.findViewById(R.id.public_id); LikeTextView = itemView.findViewById(R.id.public_favorite); - + LikedCountTextView = itemView.findViewById(R.id.liketed_count); } void bind(Book book) { titleTextView.setText(book.getTitle()); authorTextView.setText(book.getAccountId()); + Context context = itemView.getContext(); + LikedCountTextView.setText(context.getString(R.string.liked_count_format, book.getFavoritedCount())); } } } diff --git a/app/src/main/java/com/example/citrusclient/views/SearchFragment.java b/app/src/main/java/com/example/citrusclient/views/SearchFragment.java index 35095a3..88385ce 100644 --- a/app/src/main/java/com/example/citrusclient/views/SearchFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/SearchFragment.java @@ -25,12 +25,14 @@ import com.example.citrusclient.Citrus; import com.example.citrusclient.R; import com.example.citrusclient.models.Book; +import com.example.citrusclient.models.BookModel; import com.example.citrusclient.viewmodels.PublicBooksViewModel; import com.example.citrusclient.viewmodels.FavoritesViewModel; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; /** @@ -152,20 +154,40 @@ adapter.setBooks(new ArrayList<>(books)); // アダプターに新しいリストを渡す } }); -// favoritesViewModel.getFavoritesBooksLiveData().observe(getViewLifecycleOwner(), new Observer>>() { + favoritesViewModel.getFavoritesBooksLiveData().observe(getViewLifecycleOwner(), (Observer>) new Observer>() { + @Override + public void onChanged(List stringHashSetHashMap) { + if (stringHashSetHashMap != null) { + HashMap> newMap = new HashMap<>(); + + // 変換処理 + for (BookModel bookModel : stringHashSetHashMap) { + if(!newMap.containsKey(bookModel.getAccountId())){ + newMap.put(bookModel.getAccountId(), new HashSet<>()); + } + newMap.get(bookModel.getAccountId()).add(bookModel.getBookId()); + } + System.out.println("aaaaaaaaa"); + adapter.updateFavorites(newMap); + } else { + adapter.updateFavorites(new HashMap<>()); + } + } + }); + +// favoritesViewModel.getFavoritedAccountsLiveData().observe(getViewLifecycleOwner(), new Observer>() { // @Override -// public void onChanged(HashMap> stringHashSetHashMap) { -// if (stringHashSetHashMap != null) { -// adapter.updateFavorites(stringHashSetHashMap); -// } else { -// adapter.updateFavorites(new HashMap<>()); +// public void onChanged(HashMap likedBooksCount) { +// if (likedBooksCount != null) { +// adapter.updateFavorited(likedBooksCount); // HashMapを渡す // } // } // }); // Booksを読み込む publicBooksViewModel.loadAllBooks(); -// favoritesViewModel.loadFavoritesBooks(citrus.getAccountId(), citrus.getToken()); + favoritesViewModel.loadFavoritesBooks(citrus.getAccountId(), citrus.getToken()); + //favoritesViewModel.loadFavoritedAccounts(citrus.getCurLookingAccountId(), citrus.getCurLookingBookId(), citrus.getToken()); // SearchViewの設定 SearchView searchView = view.findViewById(R.id.search_word); @@ -174,6 +196,8 @@ public boolean onQueryTextSubmit(String query) { searchWord = query; loadSearchResults(searchWord, sortBy); + favoritesViewModel.loadFavoritesBooks(citrus.getAccountId(), citrus.getToken()); + favoritesViewModel.loadFavoritedAccounts(citrus.getCurLookingAccountId(), citrus.getCurLookingBookId(), citrus.getToken()); Log.d(TAG, "Search query: " + query); return true; } @@ -183,6 +207,8 @@ // adapter.filter(newText); // フィルタリングを実行 searchWord = newText; loadSearchResults(searchWord, sortBy); + favoritesViewModel.loadFavoritesBooks(citrus.getAccountId(), citrus.getToken()); + favoritesViewModel.loadFavoritedAccounts(citrus.getCurLookingAccountId(), citrus.getCurLookingBookId(), citrus.getToken()); Log.d(TAG, "Search query: " + newText); return true; } @@ -200,14 +226,17 @@ if(sort != null) sortBy = sort;//ソートはまだ Log.d(TAG, "Search query: " + title + accountId); - if(title != ""|| accountId != ""){ - if(sort != null) { + if(title != ""|| accountId != "" || sort != null){ +// if(sort != null) { publicBooksViewModel.loadSearchBooks(title, accountId, sortBy);//title,accountidでの検索 System.out.println("title: "+title+" accountId: "+accountId+" sortBy: "+sortBy); - } +// } }else { publicBooksViewModel.loadAllBooks(); // titleとaccountIdを使って検索 } } -} \ No newline at end of file +} +/* +155-173にかけてHashMapでやり取りしてたのがListに変わったので,その中にあるaccountIdとbookidを取り出してHashMap(String, HashSet)におさめる + */ \ No newline at end of file diff --git a/app/src/main/res/layout/a_public_book.xml b/app/src/main/res/layout/a_public_book.xml index cb1c9bd..d673aab 100644 --- a/app/src/main/res/layout/a_public_book.xml +++ b/app/src/main/res/layout/a_public_book.xml @@ -40,4 +40,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/public_button" app:layout_constraintVertical_bias="0.0" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8262638..0aae4d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,6 @@ 本を選択してください TestActivity Add to favorites + いいねの数: %d + \ No newline at end of file