How could i filter the listview using baseadapter

后端 未结 5 1704
遥遥无期
遥遥无期 2020-11-28 13:03

I am trying to filter the listview but getfilter method is not working,

here is the code:

@Override
public void afterTextChanged(Editable s) {
}

@Ov         


        
5条回答
  •  被撕碎了的回忆
    2020-11-28 13:28

    Implement Filterable in your baseadapter class.

    public class MainActivity extends AppCompatActivity {
    
    String names[] = {"Apple","Banana","Kiwi","Oranges","Watermelon"};
    String emails[] = {"This is apple","This is banana","This is kiwi","This is oranges","This is watermelon"};
    int images[] = {R.drawable.apple,R.drawable.banana,R.drawable.kiwi,R.drawable.oranges,R.drawable.watermelon};
    
    List itemsModelList = new ArrayList<>();
    
    ListView listView;
    
    CustomAdapter customAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        listView = findViewById(R.id.listview);
    
    
        for(int i = 0;i < names.length;i++){
    
            ItemsModel itemsModel = new ItemsModel(names[i],emails[i],images[i]);
    
            itemsModelList.add(itemsModel);
    
        }
    
         customAdapter = new CustomAdapter(itemsModelList,this);
    
        listView.setAdapter(customAdapter);
    
    
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    
    
        getMenuInflater().inflate(R.menu.search_menu,menu);
    
        MenuItem menuItem = menu.findItem(R.id.searchView);
    
        SearchView searchView = (SearchView) menuItem.getActionView();
    
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
    
                Log.e("Main"," data search"+newText);
    
                customAdapter.getFilter().filter(newText);
    
    
    
                return true;
            }
        });
    
    
        return true;
    
    }
    
    
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    
        int id = item.getItemId();
    
    
        if(id == R.id.searchView){
    
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    
    public class CustomAdapter extends BaseAdapter implements Filterable {
    
        private List itemsModelsl;
        private List itemsModelListFiltered;
        private Context context;
    
        public CustomAdapter(List itemsModelsl, Context context) {
            this.itemsModelsl = itemsModelsl;
            this.itemsModelListFiltered = itemsModelsl;
            this.context = context;
        }
    
    
    
        @Override
        public int getCount() {
            return itemsModelListFiltered.size();
        }
    
        @Override
        public Object getItem(int position) {
            return itemsModelListFiltered.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = getLayoutInflater().inflate(R.layout.row_items,null);
    
    
            TextView names = view.findViewById(R.id.name);
            TextView emails = view.findViewById(R.id.email);
            ImageView imageView = view.findViewById(R.id.images);
    
            names.setText(itemsModelListFiltered.get(position).getName());
            emails.setText(itemsModelListFiltered.get(position).getEmail());
            imageView.setImageResource(itemsModelListFiltered.get(position).getImages());
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("main activity","item clicked");
                    startActivity(new Intent(MainActivity.this,ItemsPreviewActivity.class).putExtra("items",itemsModelListFiltered.get(position)));
    
                }
            });
    
            return view;
        }
    
    
    
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
    
                    FilterResults filterResults = new FilterResults();
                    if(constraint == null || constraint.length() == 0){
                        filterResults.count = itemsModelsl.size();
                        filterResults.values = itemsModelsl;
    
                    }else{
                        List resultsModel = new ArrayList<>();
                        String searchStr = constraint.toString().toLowerCase();
    
                        for(ItemsModel itemsModel:itemsModelsl){
                            if(itemsModel.getName().contains(searchStr) || itemsModel.getEmail().contains(searchStr)){
                                resultsModel.add(itemsModel);
    
                            }
                             filterResults.count = resultsModel.size();
                                filterResults.values = resultsModel;
                        }
    
    
                    }
    
                    return filterResults;
                }
    
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
    
                    itemsModelListFiltered = (List) results.values;
                    notifyDataSetChanged();
    
                }
            };
            return filter;
        }
    }
    

    }

    You can a full tutorial on how to implement listview with search and onItemClickListener here:

    Listview with search/filter and onItemClickListener

    Source files

提交回复
热议问题