いいね実装!! #188

Merged k-shiomura merged 1 commit into nitta-lab-2024:master from nitta-lab-2024:SearchFragment on 10 Oct
Showing 9 changed files
View
1
■■■■
app/src/main/java/com/example/citrusclient/rest/FavoritesRest.java
@Field("token") String token
);
 
//主{account_id}のある本{book_id}を他の人{other_account_id}がいいねを解除する
@FormUrlEncoded
@DELETE("accounts/{account_id}/books/{book_id}/favorited/{other_account_id}")
Call<Void> removeFavorite(
@Path("account_id") String accountId,
@Path("book_id") Integer bookId,
View
2
■■■
app/src/main/java/com/example/citrusclient/viewmodels/FavoritesViewModel.java
}
});
}
 
public void setFavorite(String accountId,Integer bookId,String otherAccountId,String token){
public void setFavorite(String accountId,Integer bookId,String otherAccountId,String token){//される側ac_id,されるbo_id, するac_id, するtoken
Call<Void> call = favoritesRest.putFavorite(accountId, bookId, otherAccountId, token);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
View
31
app/src/main/java/com/example/citrusclient/views/MyAdapter.java
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.TextView;
 
import com.example.citrusclient.Citrus;
import com.example.citrusclient.R;
import com.example.citrusclient.models.Book;
import com.example.citrusclient.viewmodels.FavoritesViewModel;
 
import java.util.ArrayList;
import java.util.List;
 
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
 
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Book> originalList; // 元のデータリスト
private List<Book> filteredList; // フィルタリングされたリスト
private Object context;
 
// private List<Book> publicList;
// private List accountIdList;
// private Context context;
 
public MyAdapter(List<Book> originalList) {
this.originalList = originalList;
this.filteredList = new ArrayList<>(originalList);
citrus.setCurLookingAccountId(currentBook.getAccountId());
citrus.setCurLookingBookId(currentBook.getBookId());
((MainActivity) activity).showFragment(new OtherHomeFragment());
});
holder.LikeTextView.setOnClickListener(view -> {
Activity activity = (Activity) context;
Citrus citrus = (Citrus) activity.getApplication();
FavoritesViewModel favoritesViewModel = new ViewModelProvider((FragmentActivity)context).get(FavoritesViewModel.class);
System.out.println(holder.LikeTextView.getTag());
if(holder.LikeTextView.getTag().equals("unliked")){
System.out.println(citrus.getAccountId()+"が"+currentBook.getAccountId()+"の"+currentBook.getBookId()+"を登録しました");
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);
view.startAnimation(animation);
holder.LikeTextView.setTag("liked");
}else if(holder.LikeTextView.getTag().equals("liked")){
System.out.println(citrus.getAccountId()+"が"+currentBook.getAccountId()+"の"+currentBook.getBookId()+"を解除しました");
favoritesViewModel.deletefavorite(currentBook.getAccountId(), currentBook.getBookId(), citrus.getAccountId(), citrus.getToken());
holder.LikeTextView.setImageResource(R.drawable.baseline_favorite_border_24);
holder.LikeTextView.setTag("unliked");
}
});
}
 
@Override
public int getItemCount() {
 
static class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTextView;
TextView authorTextView;
ImageButton LikeTextView;
 
 
ViewHolder(View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.public_button);
authorTextView = itemView.findViewById(R.id.public_id);
LikeTextView = itemView.findViewById(R.id.public_favorite);
 
}
 
void bind(Book book) {
View
66
app/src/main/java/com/example/citrusclient/views/SearchFragment.java
package com.example.citrusclient.views;
 
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.Spinner;
import android.widget.TextView;
 
import com.example.citrusclient.R;
import com.example.citrusclient.models.Book;
import com.example.citrusclient.viewmodels.PublicBooksViewModel;
import com.example.citrusclient.viewmodels.FavoritesViewModel;
 
import java.util.ArrayList;
 
 
 
 
/**
* A simple {@link Fragment} subclass.
* Use the {@link SearchFragment#newInstance} factory method to
private MyAdapter adapter;
private RecyclerView recyclerView;
private RecyclerView recyclerView1; // sort_by用のRecyclerView
private PublicBooksViewModel publicBooksViewModel;
private FavoritesViewModel favoritesViewModel;
 
private Integer sortBy = 0;
 
EditText editText;
mParam2 = getArguments().getString(ARG_PARAM2);
}
 
publicBooksViewModel = new ViewModelProvider(this).get(PublicBooksViewModel.class);
favoritesViewModel = new ViewModelProvider(this).get(FavoritesViewModel.class);
}
 
// @Override
// public View onCreateView(LayoutInflater inflater, ViewGroup container,
// フラグメントのレイアウトをインフレート
return inflater.inflate(R.layout.fragment_search, container, false);
}
@SuppressLint("WrongViewCast")
// public void onViewCreated(@NonNull View view, @NonNull Bundle saveInstanceState){
// super.onViewCreated(view, saveInstanceState);
//
// adapter = new MyAdapter(new ArrayList<>());
// RecyclerView recyclerView = view.findViewById(R.id.public_list);
// recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
// recyclerView.setAdapter(adapter);
// RecyclerView recyclerView1 = view.findViewById(R.id.sort_by);
// recyclerView1.setLayoutManager(new LinearLayoutManager(view.getContext()));
// recyclerView1.setAdapter(adapter);
//
// publicBooksViewModel.getAllBooksLiveData().observe(getViewLifecycleOwner(), new Observer<ArrayList<Book>>() {
// @Override
// public void onChanged(ArrayList<Book> books) {
// if (books != null) {
// publicList = new ArrayList<>(books);
// adapter.setBooks(publicList); // アダプターに新しいリストを渡す
// }
// }
// });
//
// publicBooksViewModel.loadAllBooks();
//
// view.findViewById(R.id.rbLike).setOnClickListener(view1 -> sortBy = 0);//
// view.findViewById(R.id.rbOld).setOnClickListener(view1 -> sortBy = 1);//
// //view.findViewById(R.id.rbNew).setOnClickListener(view1 -> sortBy = 2);//favorite
//
// SearchView searchView = view.findViewById(R.id.search_word);
// searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// @Override
// public boolean onQueryTextSubmit(String query) {
// loadSearchResults(query, sortBy);
// Log.d(TAG, "Search query: " + query);
// return true;
// }
// public boolean onQueryTextChange(String newText) {
// adapter.filter(newText); // フィルタリングを実行
// return true;
// }
//
// });
// }
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
adapter = new MyAdapter(new ArrayList<>());
RecyclerView recyclerView = view.findViewById(R.id.public_list);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
if(title != "") {
if (accountId != "") {
publicBooksViewModel.loadSearchBooks(title, accountId, sortBy);//title,accountidでの検索
System.out.println("title: "+title+" accountId: "+accountId+" sortBy: "+sortBy);
}/* else {
publicBooksViewModel.loadSearchTitleBooks(title, sortBy);//titleのみの検索
}
if (accountId != null) {
publicBooksViewModel.loadSearchAccountIdBooks(accountId, sortBy);//accountidでの検索
} */else {
}else {
publicBooksViewModel.loadAllBooks();
}
// titleとaccountIdを使って検索
}
View
16
app/src/main/res/anim/touch.xml 0 → 100644
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
>
<scale
android:fromXScale="0.5"
android:toXScale="1"
android:fromYScale="0.5"
android:toYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:duration="300"
android:fillAfter="true"
/>
</set>
View
6
app/src/main/res/drawable/baseline_favorite_24.xml 0 → 100644
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FF0000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>
View
6
app/src/main/res/drawable/baseline_favorite_border_24.xml 0 → 100644
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
</vector>
View
21
app/src/main/res/layout/a_public_book.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
>
tools:ignore="ExtraText">
 
<Button
android:id="@+id/public_button"
android:layout_width="600dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/public_id" />
app:layout_constraintTop_toBottomOf="@id/public_id"
app:layout_constraintVertical_bias="0" />
 
<TextView
android:id="@+id/public_id"
android:layout_width="100dp"
android:layout_height="30dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
 
<ImageButton
android:id="@+id/public_favorite"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:backgroundTint="#00FFFFFF"
android:contentDescription="@string/favorite_icon"
android:src="@drawable/baseline_favorite_border_24"
android:tag="unliked"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toBottomOf="@+id/public_button"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
View
1
■■■■
app/src/main/res/values/strings.xml
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="select_book_spinner">本を選択してください</string>
<string name="title_activity_test">TestActivity</string>
<string name="favorite_icon">Add to favorites</string>
</resources>