Android 使用searchview筛选回收器视图
我试着通过在工具栏上放置一个SearchView来过滤RecyclerView,我从25分钟的教程开始就遵循它,因为它表达了我想要的东西, 在教程中实现时,他们使用了“ArrayList newList=newarraylist()”,这很好,但我想用这个表单实现它 “ArrayList>newList=new ArrayList()”这是我在整个项目中采用的格式。我尝试按如下方式执行: ///活动Android 使用searchview筛选回收器视图,android,searchview,android-recyclerview,android-filterable,Android,Searchview,Android Recyclerview,Android Filterable,我试着通过在工具栏上放置一个SearchView来过滤RecyclerView,我从25分钟的教程开始就遵循它,因为它表达了我想要的东西, 在教程中实现时,他们使用了“ArrayList newList=newarraylist()”,这很好,但我想用这个表单实现它 “ArrayList>newList=new ArrayList()”这是我在整个项目中采用的格式。我尝试按如下方式执行: ///活动 public class MainActivity extends AppCompatActiv
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类MainActivity扩展AppCompatActivity实现SearchView.OnQueryTextListener{
//DB类来执行与DB相关的操作
DBController=新的DBController(MainActivity.this);
//进度对话框对象
ArrayList ArrayList=新的ArrayList();
私人回收站;
私人专线经理;布局经理;
私有用户适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
//从SQLite数据库获取用户记录
ArrayList userList=controller.getAllUsers();
//如果SQLite数据库中存在用户
如果(userList.size()!=0){
recyclerView=(recyclerView)findViewById(R.id.usersList);
recyclerView.setHasFixedSize(true);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
控制器=新的DBController(MainActivity.this);
ArrayList users=controller.getAllUsers();
适配器=新用户适配器(用户,此);
recyclerView.setAdapter(适配器);
adapter.notifyDataSetChanged();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。主菜单,菜单);
final MenuItem searchItem=menu.findItem(R.id.action\u search);
最终SearchView SearchView=(SearchView)MenuItemCompat.getActionView(searchItem);
setOnQueryTextListener(这个);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。
int id=item.getItemId();
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
newText=newText.toLowerCase();
ArrayList newList=新的ArrayList();
for(HashMap条目:arrayList){
字符串名称=entry.put(“用户名”,newText);
if(name.contains(newText)){
newList.add(条目);
}}
adapter.setFilter(newList);
返回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();
}
}
公共类UsersAdapter扩展了RecyclerView.Adapter{
ArrayList mDataSet=新的ArrayList();
上下文ctx;
public UsersAdapter(ArrayList mDataSet,Context ctx){
this.mDataSet=mDataSet;
这个.ctx=ctx;
}
@凌驾
公共用户ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.user_行,parent,false);
UserViewHolder UserViewHolder=新的UserViewHolder(v,mDataSet,ctx);
返回userViewHolder;
}
@凌驾
public void onBindViewHolder(UserViewHolder,int位置){
holder.name_entry.setText(mDataSet.get(position.get(“userId”));
holder.email_entry.setText(mDataSet.get(position.get)(“用户名”);
holder.icon_entry.setText(“+mDataSet.get(position.get(“number”)));
}
@凌驾
public int getItemCount(){
返回mDataSet.size();
}
公共静态类UserViewHolder扩展了RecyclerView.ViewHolder{
卡德维尤;
文本视图名称输入、电子邮件输入、图标输入;
上下文ctx;
ArrayList mDataSet=新的ArrayList();
公共用户视图持有者(视图项视图、ArrayList mDataSet、上下文ctx){
超级(项目视图);
this.mDataSet=mDataSet;
这个.ctx=ctx;
cardView=(cardView)itemView.findViewById(R.id.user\u布局);
name\u entry=(TextView)itemView.findViewById(R.id.name\u entry);
email\u entry=(TextView)itemView.findViewById(R.id.email\u entry);
icon_entry=(TextView)itemView.findViewById(R.id.icon_entry);
}
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
public void setFilter(ArrayList newList){
//我们已经使用了hashmap,请在这里找到如何使用它
mDataSet=newarraylist();
mDataSet.addAll(newList);
notifyDataSetChanged();
}
}
但当我点击搜索图标时,回收器视图会消失,所有数据都会消失,直到我恢复应用程序。在我看来,我添加的是空数据,虽然我不确定,因为我对安卓有点陌生,有没有关于我哪里弄错的想法,以及如何让它工作的想法。我知道有解决方案,但我没有弄清楚。您在活动类中声明:
ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>> ();
因为您已按此字段进行筛选,并且始终存在数据。最好将此变量从arrayList重命名为userList:)您在活动类中声明:
ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>> ();
因为您已按此字段进行筛选,并且始终存在数据。最好将这个变量从arrayList重命名为userList:)@pskink当我使用这个新类时,这意味着我必须将整个适配器类更改为您提供的代码,问题是在我的适配器类中,我介绍了诸如on item clicked listener之类的内容,但我不明白如何使用您的解决方案使用它们。Real是android的新手,所以我stacked@pskink当我使用这个新类时,这意味着我必须将整个适配器类更改为您提供的代码