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 2811bd6..3594317 100644 --- a/app/src/main/java/com/example/citrusclient/views/MyAdapter.java +++ b/app/src/main/java/com/example/citrusclient/views/MyAdapter.java @@ -1,86 +1,3 @@ -//package com.example.citrusclient.views; -// -//import android.view.LayoutInflater; -//import android.view.View; -//import android.view.ViewGroup; -//import android.widget.TextView; -// -//import androidx.recyclerview.widget.RecyclerView; -// -//import com.example.citrusclient.R; -//import com.example.citrusclient.models.Book; -// -//import java.util.ArrayList; -//import java.util.List; -// -//public class MyAdapter extends RecyclerView.Adapter { -// private List originalList; // 元のデータリスト -// private List filteredList; -// -// public MyAdapter(List originalList) { -// this.originalList = originalList; -// this.filteredList = new ArrayList<>(originalList); -// } -// -// @Override -// public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { -// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_public_book, parent, false); -// return new ViewHolder(view); -// } -// -// @Override -// public void onBindViewHolder(ViewHolder holder, int position) { -// Book currentBook = filteredList.get(position); -// holder.bind(currentBook); -// } -// -// @Override -// public int getItemCount() { -// return filteredList.size(); -// } -// -// public void filter(String query) { -// filteredList.clear(); -// if (query.isEmpty()) { -// filteredList.addAll(originalList); -// } else { -// String[] queryWords = query.toLowerCase().trim().split("\\s+"); -// for (Book item : originalList) { -// boolean matchesAll = true; -// for (String word : queryWords) { -// if (!item.getAccountId().toLowerCase().contains(word)) { -// matchesAll = false; -// break; -// } -// } -// if (matchesAll) { -// filteredList.add(item); -// } -// } -// } -// notifyDataSetChanged(); -// } -// -// public void setBooks(ArrayList publicList) { -// } -// -// static class ViewHolder extends RecyclerView.ViewHolder { -// TextView titleTextView; -// TextView authorTextView; -// -// ViewHolder(View itemView) { -// super(itemView); -// titleTextView = itemView.findViewById(R.id.public_button); -// authorTextView = itemView.findViewById(R.id.public_id); -// } -// -// void bind(Book book) { -// titleTextView.setText(book.getTitle()); -// authorTextView.setText(book.getAccountId()); -// } -// } -//} - package com.example.citrusclient.views; import android.graphics.Color; @@ -146,9 +63,8 @@ @Override public int getItemCount() { - return filteredList.size(); + return filteredList != null ? filteredList.size() : 0; // filteredListがnullの場合は0を返す } - // 新しいデータを設定するメソッド public void setBooks(List books) { originalList.clear(); @@ -179,6 +95,7 @@ TextView titleTextView; TextView authorTextView; + ViewHolder(View itemView) { super(itemView); titleTextView = itemView.findViewById(R.id.public_button); 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 dddb7e8..9ed7156 100644 --- a/app/src/main/java/com/example/citrusclient/views/SearchFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/SearchFragment.java @@ -1,40 +1,35 @@ package com.example.citrusclient.views; import android.annotation.SuppressLint; -import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import androidx.annotation.NonNull; -import androidx.core.view.MenuItemCompat; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.text.Editable; import android.util.Log; import android.view.LayoutInflater; -import android.view.MenuItem; 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.Citrus; import com.example.citrusclient.R; import com.example.citrusclient.models.Book; import com.example.citrusclient.viewmodels.PublicBooksViewModel; import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; /** * A simple {@link Fragment} subclass. @@ -61,13 +56,15 @@ private SearchView searchView; private String searchWord; + private MyAdapter adapter; + private RecyclerView recyclerView; + private RecyclerView recyclerView1; // sort_by用のRecyclerView + private PublicBooksViewModel publicBooksViewModel; private Integer sortBy = 0; EditText editText; - private MyAdapter adapter; - /** * Use this factory method to create a new instance of * this fragment using the provided parameters. @@ -88,7 +85,6 @@ private ArrayList publicList; private ArrayList name; - PublicBooksViewModel publicBooksViewModel; @Override public void onCreate(Bundle savedInstanceState) { @@ -101,75 +97,133 @@ publicBooksViewModel = new ViewModelProvider(this).get(PublicBooksViewModel.class); } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_search, container, false); +// @Override +// public View onCreateView(LayoutInflater inflater, ViewGroup container, +// Bundle savedInstanceState) { +// // Inflate the layout for this fragment +// return inflater.inflate(R.layout.fragment_search, container, false); +// } +@Override +public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // フラグメントのレイアウトをインフレート + return inflater.inflate(R.layout.fragment_search, container, false); } - @SuppressLint("WrongViewCast") - public void onViewCreated(@NonNull View view, @NonNull Bundle saveInstanceState){ - super.onViewCreated(view, saveInstanceState); - +// 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>() { +// @Override +// public void onChanged(ArrayList 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())); 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>() { + // Spinnerの設定 + Spinner sortBySpinner = view.findViewById(R.id.sort_by_spinner); + ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource( + getContext(), + R.array.sort_options, // res/values/strings.xmlで定義 + android.R.layout.simple_spinner_item); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + sortBySpinner.setAdapter(spinnerAdapter); + + // Spinnerの選択リスナーを設定 + sortBySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override - public void onChanged(ArrayList books) { - if (books != null) { - publicList = new ArrayList<>(books); - adapter.setBooks(publicList); // アダプターに新しいリストを渡す - } + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // positionに基づいてソートの処理を行う + sortBy = position; // 例えば、0が"Sort by Title"、1が"Sort by Author"など + loadSearchResults(searchWord, sortBy); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // 何も選択されていない場合の処理(必要に応じて) } }); + // データの取得とアダプターへのセット + publicBooksViewModel.getAllBooksLiveData().observe(getViewLifecycleOwner(), books -> { + if (books != null) { + adapter.setBooks(new ArrayList<>(books)); // アダプターに新しいリストを渡す + } + }); + + // Booksを読み込む publicBooksViewModel.loadAllBooks(); + // SearchViewの設定 SearchView searchView = view.findViewById(R.id.search_word); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { - loadSearchResults(query); + searchWord = query; + loadSearchResults(searchWord, sortBy); Log.d(TAG, "Search query: " + query); return true; } @Override -// public boolean onQueryTextChange(String newText) { -// //adapter.filter(newText); // フィルタリングを実行 -// loadSearchResults(newText); -// System.out.println("ahe"); -// return true; -//} public boolean onQueryTextChange(String newText) { adapter.filter(newText); // フィルタリングを実行 return true; } - }); } - private void loadSearchResults(String query) { - // 空白で分割 - String[] parts = query.split(" "); - String title = parts.length > 0 ? parts[0] : ""; // 最初の部分をtitleに - String accountId = parts.length > 1 ? parts[1] : ""; // 2番目の部分をaccountIdに - Integer sortBy = 1; - //if(sortBy != null) sortBy = sort;//ソートはまだ + private void loadSearchResults(String query, Integer sort) { + String title = "", accountId = ""; + if(query != null) { + // 空白で分割 + String[] parts = query.split(" "); + title = parts.length > 0 ? parts[0] : ""; // 最初の部分をtitleに + accountId = parts.length > 1 ? parts[1] : ""; // 2番目の部分をaccountIdに + } + if(sortBy != null) sortBy = sort;//ソートはまだ Log.d(TAG, "Search query: " + title + accountId); - if(title != null) { - if (accountId != null) { + if(title != "") { + if (accountId != "") { publicBooksViewModel.loadSearchBooks(title, accountId, sortBy);//title,accountidでの検索 - if(accountId == null)accountId = "null"; - if(accountId == "")accountId = "space"; System.out.println("title: "+title+" accountId: "+accountId+" sortBy: "+sortBy); }/* else { publicBooksViewModel.loadSearchTitleBooks(title, sortBy);//titleのみの検索 @@ -182,79 +236,4 @@ // titleとaccountIdを使って検索 } } -} - -class PublicAdapter extends RecyclerView.Adapter{ - - private List publicList; - private List accountIdList; - private Context context; - - PublicAdapter(List id, List publics, Context context){ - this.accountIdList = id; - this.publicList = publics; - this.context = context; - } - - public void setBooks(List publics){ - publicList = publics; - notifyDataSetChanged(); - } - - @NonNull - @Override - public PublicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_public_book, parent, false); - return new PublicViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull PublicAdapter.PublicViewHolder holder, int position) { - holder.idText.setText(accountIdList.get(position).toString()); - holder.idText.setHeight(30); - holder.idText.setWidth(100); - Book publicData = this.publicList.get(position); - holder.publicButton.setText(publicData.getTitle()); - - int red, green, blue; - if (publicData.getColor() == null || publicData.getColor().length() < 7) { - red = 255; - green = 255; - blue = 255; - } else { - red = Integer.parseInt(publicData.getColor().substring(1, 3), 16); - green = Integer.parseInt(publicData.getColor().substring(3, 5), 16); - blue = Integer.parseInt(publicData.getColor().substring(5, 7), 16); - } - - holder.publicButton.setBackgroundColor(Color.rgb(red, green, blue)); - holder.publicButton.setTextColor(Color.rgb(255 - red, 255 - green, 255 - blue)); -// holder.publicButton.setOnClickListener(v -> { -// Calendar c = Calendar.getInstance(); -// Activity activity = (Activity) context; -// Citrus citrus = (Citrus) activity.getApplication(); -// citrus.setCurYear(c.get(Calendar.YEAR)); -// citrus.setCurMonth(c.get(Calendar.MONTH) + 1); -// citrus.setCurDay(c.get(Calendar.DATE)); -// citrus.setCurBookId(publicData.getBookId()); -// ((MainActivity) activity).showFragment(new HomeFragment()); -// }); - - } - - @Override - public int getItemCount() { - return publicList.size(); - } - - static class PublicViewHolder extends RecyclerView.ViewHolder{ - Button publicButton; - TextView idText; - public PublicViewHolder(@NonNull View itemView){ - - super(itemView); - publicButton = itemView.findViewById(R.id.public_button); - idText = itemView.findViewById(R.id.public_id); - } - } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 69464fe..cc98b2d 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -11,7 +11,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/sort_strings.xml b/app/src/main/res/values/sort_strings.xml new file mode 100644 index 0000000..d14f7f5 --- /dev/null +++ b/app/src/main/res/values/sort_strings.xml @@ -0,0 +1,10 @@ + + + YourAppName + + 新しい順 + 古い順 + いいね順 + + + \ No newline at end of file