я пытаюсь отфильтровать recyclerview с помощью search view, но это не работает

#java #android

#java #Android

Вопрос:

Я следовал руководствам, но у каждого из них своя логика, я попробовал этот код, в котором возникла проблема с тем, что список не заменяется новым списком, в то время как я написал код замены списка результатов поиска более старым списком, помните, что мой recycler-view работает отлично, единственная проблема в том, что вид поиска не работает

вот мой код

 adapter class
  
 public class AdlistAdapter extends RecyclerView.Adapter<AdlistAdapter.AdViewHolder> {
    private Context mCtx;
    private List<DetailsofAd> productList;

    public AdlistAdapter(Context mCtx, List<DetailsofAd> productList) {
        this.mCtx = mCtx;
        this.productList = productList;
    }
//note my list is perfectly working
//here is filter method
   public void setFilter(ArrayList<DetailsofAd> newList){
        productList=new ArrayList<>();
        productList.addAll(newList);
        notifyDataSetChanged();
    }
  

основной класс

 public class SearchDishes extends AppCompatActivity implements SearchView.OnQueryTextListener{
    List<DetailsofAd> productList;
    RecyclerView recyclerView;

   android.support.v7.widget.Toolbar toolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_dishes);
        toolbar=(android.support.v7.widget.Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
        recyclerView = (RecyclerView) findViewById(R.id.recylcermain);
        empty=(TextView) findViewById(R.id.empty);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        productList = new ArrayList<>();   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.action_bar,menu);
        MenuItem menuItem=menu.findItem(R.id.search);
        android.support.v7.widget.SearchView searchView=(android.support.v7.widget.SearchView)menuItem.getActionView();
        return true;
    }
   @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        newText=newText.toLowerCase();
        ArrayList<DetailsofAd> newList=new ArrayList<>();
        for (DetailsofAd detailsofAd : newList)
        {
            String title=detailsofAd.getTitle().toLowerCase();
            if (title.contains(newText))
            {
                newList.add(detailsofAd);
            }
        }
        AdlistAdapter adapter = new AdlistAdapter(SearchDishes.this, newList);
        adapter.setFilter(newList);

        return false;
    }
  

Ответ №1:

Не создавайте новый список в методе filter. просто назначьте по this.ProductList . пожалуйста, измените свой код на это.

 public class AdlistAdapter extends RecyclerView.Adapter<AdlistAdapter.AdViewHolder> {
    private Context mCtx;
    private List<DetailsofAd> productList;

    public AdlistAdapter(Context mCtx, List<DetailsofAd> productList) {
        this.mCtx = mCtx;
        this.productList = productList;
    }
//note my list is perfectly working
//here is filter method
   public void setFilter(ArrayList<DetailsofAd> newList){
        this.productList = newList;
        notifyDataSetChanged();
    }
  

Комментарии:

1. @muizzalvi я не мог понять, почему вы создаете newList в методе onQueryTextChange . вы фильтруете пустой список. пожалуйста, фильтруйте с помощью непустого списка.

2. как я уже упоминал, я только что следовал руководству, мой onQueryTextChange даже не отображает всплывающее окно, я думаю, что есть проблема с версиями SearchView.. пожалуйста, предоставьте ссылку на последний и простой учебник для этого, если у вас есть, спасибо

3. смотрите это