Search code examples
androidlistviewandroid-listviewnotifydatasetchanged

Trying to filter items in a listview, trough another activity, how to update the listview?


I have looked trough some samples on google/stack and didnt find any good solution for my problem.

i got, in the activity where the listview is shown, a filter made(winesCopy is a copy of the wines list):

public static List<Wine> filterWinesString(List<Wine> wines, Object filterItem)
    {
        for(Wine o : wines)
        {
            if(o.getColor().equals((String)filterItem)||o.getCountry().equals((String)filterItem)||o.getDescription().equals((String)filterItem)||o.getTaste().equals((String)filterItem)||
                    o.getBiologic().equals(filterItem)||o.getSparkling().equals(filterItem)||filterItem.equals(o.getYear()))
            {
                filteredList.add((Wine) o);
            }
        }
        if(!filteredList.equals(null))
        {
            wines= filteredList;
        return wines;
        }
        else{
            return wines;
        }
    }

    public static void clearFilter()
    {
        filteredList.clear();
        wines=winesCopy;
    }

and in the activity that i use as the "dialog":

Button btnSubmit = (Button) findViewById(R.id.activity_btn_add_filter);

        btnSubmit.setOnClickListener(new OnClickListener() {

              @Override
              public void onClick(View v) {
                  if(!etLand.equals(null))
                  {
                  ListWineView.filterWinesString(ListWineView.winesCopy,etLand.getText().toString());
                  }
                  if(!etTaste.equals(null)){
                      ListWineView.filterWinesString(ListWineView.winesCopy,etTaste.getText().toString());
                  }
                  if(!etYear.equals(null)){
                      ListWineView.filterWinesString(ListWineView.winesCopy,etYear.getText().toString());
                  }
                  if(cbBiologic.isChecked()){
                      ListWineView.filterWinesString(ListWineView.winesCopy, "true");
                  }else{
                      ListWineView.filterWinesString(ListWineView.winesCopy, "false");
                  }
                  if(cbMouserend.isChecked()){
                      ListWineView.filterWinesString(ListWineView.winesCopy, "true");
                  }else{
                      ListWineView.filterWinesString(ListWineView.winesCopy, "false");
                  }
                  if(spinner1.getSelectedItemId()!=0){
                      ListWineView.filterWinesString(ListWineView.winesCopy,spinner1.getSelectedItem().toString());
                  }


                  ListWinesViewFilterActivity.this.finish();
              }
        });

      }

i thought i should use the notifyDatasetChange() here:

btnFilter.setText("Filter");
    btnFilter.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(ListWineView.this, ListWinesViewFilterActivity.class);
            startActivity(i);
            adapter.notifyDataSetChanged();
        }
    });

but the listview is not refreshing.

EDIT i have now changed a bit of the code, and got it working.

solution posted as answer.


Solution

  • activity where the filter method is put

     public static List<Wine> filterByCountry(String country) {
                if (country.equals("")) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (!wine.getCountry().contains(country)) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
            public static List<Wine> filterByTaste(String taste) {
                if (taste.equals("")) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (!wine.getTaste().contains(taste)) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
            public static List<Wine> filterByYear(int year ) {
                if (Integer.valueOf(year)==null) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (wine.getYear()!=year) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
    
            public static List<Wine> filterByBiologic(boolean biologic) {
                if (!biologic) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (wine.getBiologic()!=biologic) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
    
            public static List<Wine> filterBySparkling(boolean sparkling) {
                if (!sparkling) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (wine.getSparkling()!=sparkling) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
    
            public static List<Wine> filterByColor(String color) {
                if (color.equals("all")) {
                    return wines;
                }
                ArrayList<Wine> winesFil = new ArrayList<Wine>(wines);
                for(Wine wine : winesFil) {
                    if (!wine.getCountry().contains(color)) {
                        filteredList.remove(wine);
                    }
                }
                return filteredList;
            }
    
            public static void clearFilter()
            {
                adapter.clear();
                for(Wine wine : winesCopy)
                {
                adapter.add(wine);
                }
                adapter.notifyDataSetChanged();
                lv.setAdapter(adapter);
                filteredList = new ArrayList<Wine>(wines);
            }
    
            public static void setFilter()
            {
                adapter.clear();
                for(Wine wine : filteredList)
                {
                adapter.add(wine);
                }
                adapter.notifyDataSetChanged();
                lv.setAdapter(adapter);
            }
    

    activity where the filtering input is given:

     @Override
                  public void onClick(View v) {
                        ListWineView.clearFilter();
                        ListWineView.filterByCountry(etLand.getText().toString());
                        if(!etYear.getText().toString().equals("")){
                        ListWineView.filterByYear(Integer.valueOf(etYear.getText().toString()));
                        }
                        ListWineView.filterByTaste(etTaste.getText().toString());
                        ListWineView.filterByBiologic(cbBiologic.isSelected());
                        ListWineView.filterBySparkling(cbMouserend.isSelected());
                        ListWineView.filterByColor(spinner1.getSelectedItem().toString());
                        ListWineView.setFilter();
                        ListWinesViewFilterActivity.this.finish();
                  }
            });