2013-07-31 3 views
0

Я отредактировал класс Adapter и расширил класс фильтрации. Моя функция поиска работает, но я не могу вернуться к исходному контенту, если я перешагуваю все в меню поиска.Пользовательский список адаптеров Adapter Filter не возвращается к исходному списку

вот мой адаптер класс:

public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable { 
Context context; 
List<FoodMenuRowItem> rowItems; 

public Menu_List_Item_Adapter(Context context, List<FoodMenuRowItem> items) { 
    this.context = context; 
    this.rowItems = items; 
} 
private class ViewHolder { 
    ImageView imageView; 
    TextView txtTitle; 
    TextView txtDesc; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.food_menu_item_list_row, 
       null); 
     holder = new ViewHolder(); 
     holder.txtDesc = (TextView) convertView.findViewById(R.id.price); 
     holder.txtTitle = (TextView) convertView 
       .findViewById(R.id.description); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.img); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    FoodMenuRowItem rowItem = (FoodMenuRowItem) getItem(position); 

    holder.txtDesc.setText(rowItem.getDesc()); 
    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.imageView.setImageResource(rowItem.getImageId()); 

    return convertView; 
} 

@Override 
public int getCount() { 
    return rowItems.size(); 
} 

@Override 
public Object getItem(int position) { 
    return rowItems.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return rowItems.indexOf(getItem(position)); 
} 

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 

      if (results.count == 0) 
       notifyDataSetInvalidated(); 
      else { 
       rowItems = (List<FoodMenuRowItem>) results.values; 
       Menu_List_Item_Adapter.this.notifyDataSetChanged(); 
      } 

     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      FilterResults results = new FilterResults(); 

      if (constraint == null || constraint.length() == 0) { 
       // No filter implemented we return all the list 
       results.values = rowItems; 
       results.count = rowItems.size(); 

      } else { // We perform filtering operation 
       List<FoodMenuRowItem> filteredRowItems = new ArrayList<FoodMenuRowItem>(); 

       for (FoodMenuRowItem p : rowItems) { 
        if (p.getName() 
          .toUpperCase() 
          .startsWith(constraint.toString().toUpperCase())) { 
         filteredRowItems.add(p); 
        } 
       } 
       results.values = filteredRowItems; 
       results.count = filteredRowItems.size(); 
      } 
      return results; 
     } 
    }; 
} 

}

я проверить, если результаты равны нулю или нулевой, и если это так, чтобы вернуть первоначальный список? Что мне не хватает?

+0

http://stackoverflow.com/questions/17917578/how-to-filter-by-listview/17920959#17920959. фильтрация элементов списка. это не совсем так, как ваш код, но вы можете использовать его в качестве ссылки для изменения в соответствии с вашими требованиями. использовал два списка для исходных данных, если поиск не совпадает с другим для найденных элементов. – Raghunandan

+0

Вы используете базу данных для сбора записей ?? – UnderGround

+0

Еще нет? просто фиктивный массив на данный момент. Зачем? – Zapnologica

ответ

3

Вы должны сохранить свои строки, чтобы вернуться к нему, а затем, получив пустой текст в области поиска, вы должны восстановить этот массив в rowItems, чтобы адаптер мог перезагрузить себя. Что-то вроде:

public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable { 
Context context; 
List<FoodMenuRowItem> rowItems; 
List<FoodMenuRowItem> storedRowItems; 

public Menu_List_Item_Adapter(Context context, List<FoodMenuRowItem> items) { 
this.context = context; 
this.rowItems = items; 
this.storedRowItems = new List<FoodMenuRowItem>(items); 
} 

// ... 

@Override 
public Filter getFilter() { 
return new Filter() { 
    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, 
      FilterResults results) { 

     if (results.count == 0) 
      notifyDataSetInvalidated(); 
     else { 
      rowItems = (List<FoodMenuRowItem>) results.values; 
      Menu_List_Item_Adapter.this.notifyDataSetChanged(); 
     } 

    } 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     FilterResults results = new FilterResults(); 

     if (constraint == null || constraint.length() == 0) { 
      // No filter implemented we return all the list 
      results.values = storedRowItems; 
      results.count = storedRowItems.size(); 

     } else { // We perform filtering operation 
      List<FoodMenuRowItem> filteredRowItems = new ArrayList<FoodMenuRowItem>(); 

      rowItems = storedRowItems; 
      for (FoodMenuRowItem p : rowItems) { 
       if (p.getName() 
         .toUpperCase() 
         .startsWith(constraint.toString().toUpperCase())) { 
        filteredRowItems.add(p); 
       } 
      } 
      results.values = filteredRowItems; 
      results.count = filteredRowItems.size(); 
     } 
     return results; 
    } 
}; 
} 
+0

Хорошо, я понимаю, что вы имеете в виду, но я никогда не редактирую свой список строк в списке поиска, так почему это меняется? – Zapnologica

+0

Нет, вы редактируете на publishResults. – yahya

1

не вернуться к original list, потому что, когда вы передаете список объектов custom adapter, adapter относится адрес списка, и когда вы будете искать что-то, что изменяет список, который был по этому адресу. Но когда вы нажимаете backspace, адаптер не восстанавливает список. Таким образом, мы создали еще один List<Object> nlist = new ArrayList<Object>(originalList);, это означает, что список создается в другом месте с тем же контентом. Теперь для восстановления списка используйте nlist.

0

Следуйте за изменениями.

  1. Создать временную переменную для хранения исходных данных

    List<FoodMenuRowItem> tempitems=new ArrayList<FoodMenuRowItem>(); 
    
  2. Инициализировать temperory переменную в конструкторе

    this.tempitems=items; 
    
  3. Заменить цикл в методе performFiltering к

     for (int i = 0; i < tempitems.size(); i++) { 
         filterableString = tempitems.get(i); 
         if (filterableString.getUserName().toLowerCase() 
           .contains(filterString)) { 
          Filtered_Names.add(filterableString); 
    
          Log.v("riyas:" + filterableString.getUserName(), 
            "riyas filtering"); 
         } 
        } 
    
Смежные вопросы