【问题标题】:filter Recycler view using searchview使用 searchview 过滤回收站视图
【发布时间】:2017-03-16 17:51:11
【问题描述】:

我尝试通过在工具栏上放置一个 SearchView 来过滤 RecyclerView,我从 25 分钟开始遵循 this 教程,因为它准确地表达了我正在寻找的内容, 在从教程中实现时,他们使用了“ArrayList newList= new ArrayList()”,它工作得很好,但我想使用这种形式来实现它 "ArrayList > newList= new ArrayList()" 因为是我在项目中使用的格式。我尝试按如下方式进行:

/// 活动

public class MainActivity extends AppCompatActivity implements    SearchView.OnQueryTextListener {
// DB Class to perform DB related operations
DBController controller = new DBController(MainActivity.this);
// Progress Dialog Object
ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>> ();
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private UsersAdapter adapter;
@Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);
 // Get User records from SQLite DB
    ArrayList<HashMap<String, String>> userList = controller.getAllUsers();
    // If users exists in SQLite DB
    if (userList.size() != 0) {
        recyclerView = (RecyclerView) findViewById(R.id.usersList);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        controller = new DBController(MainActivity.this);
        ArrayList<HashMap<String, String>> users = controller.getAllUsers();
        adapter = new UsersAdapter(users,this);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
     }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
  searchView.setOnQueryTextListener(this);
    return true;

}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here.
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

    @Override
      public boolean onQueryTextChange(String newText) {
    newText = newText.toLowerCase();
    ArrayList<HashMap<String, String>> newList= new ArrayList<>();
    for(  HashMap<String, String> entry : arrayList){
        String name= entry.put("userName",newText);
        if(name.contains(newText)){
      newList.add(entry);
    }}
    adapter.setFilter(newList);
     return  true;
    }
     }

///适配器类

    public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserViewHolder> {
ArrayList<HashMap<String, String>> mDataSet= new ArrayList<HashMap<String, String>> ();
        Context ctx;
       public UsersAdapter(ArrayList<HashMap<String, String>> mDataSet,Context ctx)      {
       this.mDataSet = mDataSet;
       this.ctx=ctx;
        }
      @Override
      public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View v =    LayoutInflater.from(parent.getContext()).inflate(R.layout.user_row, parent,       false);
      UserViewHolder userViewHolder = new UserViewHolder(v,mDataSet,ctx);
       return userViewHolder;
         }
        @Override
     public void onBindViewHolder(UserViewHolder holder, int position) {
    holder.name_entry.setText(mDataSet.get(position).get("userId"));
    holder.email_entry.setText(mDataSet.get(position).get("userName"));
    holder.icon_entry.setText(""+mDataSet.get(position).get("number"));
          }
         @Override
        public int getItemCount() {
              return mDataSet.size();
           }

     public static class UserViewHolder extends RecyclerView.ViewHolder  {
    CardView cardView;
    TextView name_entry, email_entry, icon_entry;
    Context ctx;
        ArrayList<HashMap<String, String>> mDataSet= new   ArrayList<HashMap<String, String>> ();
        public UserViewHolder(View itemView, ArrayList<HashMap<String,  String>>        mDataSet,Context ctx) {
            super(itemView);
            this.mDataSet=mDataSet;
         this.ctx= ctx;
         cardView = (CardView) itemView.findViewById(R.id.user_layout);
         name_entry = (TextView) itemView.findViewById(R.id.name_entry);
         email_entry = (TextView) itemView.findViewById(R.id.email_entry);
         icon_entry = (TextView) itemView.findViewById(R.id.icon_entry);
              }
               }

        @Override
       public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
           }

       public void setFilter(ArrayList<HashMap<String, String>> newList){
        //we have used hashmap,  find how to use it here
    mDataSet= new ArrayList<HashMap<String, String>>();
    mDataSet.addAll(newList);
    notifyDataSetChanged();
        }

      }

但是当我单击搜索图标时,回收站视图会随着所有数据消失,直到我恢复应用程序。在我看来,我正在添加空数据,虽然我不确定,因为我对 android 很陌生,关于我在哪里弄错了以及如何使它工作的任何想法。我知道有this 解决方案,但我没搞定。

【问题讨论】:

  • @pskink 当我使用这个新类时,这意味着我必须将整个适配器类更改为您提供的代码,问题出在我的适配器类中,我引入了诸如单击项目的侦听器之类的东西无法理解如何使用您的解决方案来使用它们。真正是 android 新手,所以我为什么要堆叠

标签: android searchview android-recyclerview android-filterable


【解决方案1】:

您已在 Activity 类中声明:

ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>> ();

但你没有分配它。应该是

 arrayList = controller.getAllUsers();

因为您已按此字段进行过滤,并且那里始终有数据。最好将此变量从 arrayList 重命名为 userList :)

【讨论】:

  • 感谢@A.Shevchuk 我已经修改了 onQueryTextChange 方法中的代码,它可以工作,但唯一剩下的是,当我单击搜索图标时,要搜索的键值消失,当我键入它以查找匹配项时重新键入它的值,直到找到完成的单词。我认为是由于这里的代码“String name= entry.put("userName",newText);" which set which 将它们设置为空并等待用户输入。我该如何解决这个问题?
  • 我已将其更改为 String name= entry.get("number").toLowerCase() 并且工作正常感谢@@A.Shevchuk
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多