在搜索上展开recyclerview

uqdfh47h  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(289)

我几乎实现了我想要的,但仍然缺少一件事。我有一个recyclerview,每个项目都有自己的recyclerview。但在一开始,没有显示每个项目自己的recyclerview。你一按按钮它就膨胀。
但当我开始使用搜索栏过滤recyclerview时,我还想扩展它。
这是我的适配器:

  1. public class SchrankAdapter extends RecyclerView.Adapter<SchrankAdapter.ViewHolder> implements Filterable {
  2. private Context context;
  3. ArrayList<CategoryName> categoryTopic = new ArrayList<>();
  4. ArrayList<CategoryName> categoryTopicFull;
  5. public SchrankAdapter(Context context, ArrayList<CategoryName> categoryTopic){
  6. this.context = context;
  7. this.categoryTopic = categoryTopic;
  8. categoryTopicFull = new ArrayList<>(categoryTopic);
  9. }
  10. @NonNull
  11. @Override
  12. public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  13. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_schrank, parent, false);
  14. return new ViewHolder(view);
  15. }
  16. @Override
  17. public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
  18. CategoryName parentItem = categoryTopic.get(position);
  19. holder.categoryName.setText(parentItem.categoryName);
  20. setCatItemRecycler(holder.childRecView, categoryTopic.get(position).getChildViewList());
  21. holder.btFolderPlus.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. holder.btFolderMinus.setVisibility(View.VISIBLE);
  25. holder.childView.setVisibility(View.VISIBLE);
  26. holder.btFolderPlus.setVisibility(View.GONE);
  27. }
  28. });
  29. holder.btFolderMinus.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. holder.btFolderPlus.setVisibility(View.VISIBLE);
  33. holder.btFolderMinus.setVisibility(View.GONE);
  34. holder.childView.setVisibility(View.GONE);
  35. }
  36. });
  37. }
  38. @Override
  39. public int getItemCount() {
  40. return categoryTopic.size();
  41. }
  42. private void setCatItemRecycler(RecyclerView recyclerView, ArrayList<CategoryChild> categoryChildrenList) {
  43. SchrankChildAdapter childAdapter = new SchrankChildAdapter(context, categoryChildrenList);
  44. recyclerView.setLayoutManager(new LinearLayoutManager(context));
  45. recyclerView.setAdapter(childAdapter);
  46. }
  47. @Override
  48. public Filter getFilter() {
  49. return filter;
  50. }
  51. private Filter filter = new Filter() {
  52. @Override
  53. protected FilterResults performFiltering(CharSequence constraint) {
  54. ArrayList<CategoryName> filteredList = new ArrayList<>();
  55. ArrayList<CategoryChild> filteredSubList = new ArrayList<>();
  56. boolean containsSubItems = false;
  57. if(constraint == null || constraint.length() == 0) {
  58. filteredList.addAll(categoryTopicFull);
  59. } else {
  60. String filterPattern = constraint.toString().toLowerCase().trim();
  61. for (CategoryName item: categoryTopicFull) {
  62. for(CategoryChild subItem: item.getChildViewList()) {
  63. if(subItem.getCategoryAttribute().toLowerCase().contains(filterPattern)) {
  64. filteredSubList.add(subItem);
  65. containsSubItems = true;
  66. }
  67. }
  68. if(containsSubItems) {
  69. filteredList.add(new CategoryName(item.getCategoryName(), filteredSubList));
  70. containsSubItems = false;
  71. filteredSubList = new ArrayList<>();
  72. }
  73. }
  74. }
  75. FilterResults results = new FilterResults();
  76. results.values = filteredList;
  77. return results;
  78. }
  79. @Override
  80. protected void publishResults(CharSequence constraint, FilterResults results) {
  81. categoryTopic.clear();
  82. categoryTopic.addAll((ArrayList) results.values);
  83. notifyDataSetChanged();
  84. }
  85. };
  86. public class ViewHolder extends RecyclerView.ViewHolder{
  87. TextView categoryName;
  88. RelativeLayout childView;
  89. RecyclerView childRecView;
  90. Button btFolderPlus, btFolderMinus;
  91. public ViewHolder(@NonNull View itemView) {
  92. super(itemView);
  93. categoryName = itemView.findViewById(R.id.categoryName);
  94. childView = itemView.findViewById(R.id.childView);
  95. childRecView = itemView.findViewById(R.id.childRecView);
  96. btFolderPlus = itemView.findViewById(R.id.btFolderPlus);
  97. btFolderMinus = itemView.findViewById(R.id.btFolderMinus);
  98. }
  99. }

}
这是我在活动中的搜索视图:

  1. SearchView searchView = findViewById(R.id.searchView);
  2. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  3. @Override
  4. public boolean onQueryTextSubmit(String query) {
  5. return false;
  6. }
  7. @Override
  8. public boolean onQueryTextChange(String newText) {
  9. schrankAdapter.getFilter().filter(newText);
  10. return false;
  11. }
  12. });

变量childview负责子项。每当我在搜索栏中输入内容时,我想将其可见性设置为可见。
一切正常,我只想改进我目前的课程。
更新:好的,我找到了解决问题的方法。我创建了一个布尔值,从一开始就设置为false。
我将此代码添加到onbindviewholder方法中:

  1. if(isSearching) {
  2. holder.btFolderMinus.setVisibility(View.VISIBLE);
  3. holder.childView.setVisibility(View.VISIBLE);
  4. holder.btFolderPlus.setVisibility(View.GONE);
  5. }
  6. else if(!isSearching) {
  7. holder.btFolderPlus.setVisibility(View.VISIBLE);
  8. holder.btFolderMinus.setVisibility(View.GONE);
  9. holder.childView.setVisibility(View.GONE);
  10. }

我编辑了我的过滤器:

  1. private Filter filter = new Filter() {
  2. @Override
  3. protected FilterResults performFiltering(CharSequence constraint) {
  4. ArrayList<CategoryName> filteredList = new ArrayList<>();
  5. ArrayList<CategoryChild> filteredSubList = new ArrayList<>();
  6. boolean containsSubItems = false;
  7. if(constraint == null || constraint.length() == 0) {
  8. filteredList.addAll(categoryTopicFull);
  9. isSearching = false;
  10. } else {
  11. String filterPattern = constraint.toString().toLowerCase().trim();
  12. for (CategoryName item: categoryTopicFull) {
  13. for(CategoryChild subItem: item.getChildViewList()) {
  14. if(subItem.getCategoryAttribute().toLowerCase().contains(filterPattern)) {
  15. filteredSubList.add(subItem);
  16. containsSubItems = true;
  17. }
  18. }
  19. if(containsSubItems) {
  20. filteredList.add(new CategoryName(item.getCategoryName(), filteredSubList));
  21. containsSubItems = false;
  22. filteredSubList = new ArrayList<>();
  23. }
  24. }
  25. isSearching = true;
  26. }
  27. FilterResults results = new FilterResults();
  28. results.values = filteredList;
  29. return results;
  30. }

也许有一天会有人搜索这个解决方案。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题