1

我尝试通过在工具栏上放置一个SearchView来过滤RecyclerView,我从它的25分钟后跟随了this教程,因为它明确表示要查找什么, 从教程实现后,他们使用“ArrayList newList = new ArrayList <>()“哪些工作正常,但我想要使用这种形式实现它 ”ArrayList> newList = new ArrayList <>()“因为是我通过了项目的格式。我试图做到这一点如下:筛选器使用searchview的Recycler视图

///活动

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解决方案,但我没有得到它。

+0

@pskink当我使用这个新类时,它意味着我必须将整个适配器类更改为您提供的代码,问题出在我的适配器类中,像项目点击听众,我不明白我怎么可以使用他们使用您的解决方案。真正是新的android为什么我堆积 –

回答

0

你在你的活动课上宣称:

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

,但你没有分配给它。它应该是

arrayList = controller.getAllUsers(); 

因为您已按此字段进行过滤,并且总是有数据。而且最好将这个变量从arrayList重命名为userList :)

+0

谢谢@ A.Shevchuk我已修改onQueryTextChange方法中的代码,它的工作原理,但唯一剩下的是,当我点击搜索图标的关键值被搜索消失,当我键入它找到匹配值重新输入,直到找到完成的单词。我认为是由于这里的代码“String name = entry.put(”userName“,newText);”该设置将其设置为空并等待用户输入。我该如何解决这个问题? –

+0

我已将它更改为String name = entry.get(“number”)。toLowerCase(),它工作正常,谢谢@@ A.Shevchuk –