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.
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();
}
});