2016-09-22 8 views
-1

Я хочу обновить свой адаптер в двух ситуациях, но ничего не случилось. Сначала я попытался назватьАдаптер не освежает

adapter.clear(); 
adapter.addAll(filteredList); //filtered list is a new list to show on adapter 
adapter.notifyDataSetChanged(); 

Второй я пытался обновить его в моем фильтре, notifyDataSetInvalidated();

Мой адаптер Класс:

public class DatabaseAdapter extends ArrayAdapter<Exhibition> { 

    private Context context; 
    private List<Exhibition> records; 
    private List<Exhibition>filterRecords; 
    private Dao<Exhibition, Integer> exhibitionDAO; 
    private ViewHolder viewHolder; 
    private SearchFilter searchFilter; 

    public DatabaseAdapter(Context context, 
          int itemView, 
          List objects, 
          Dao<Exhibition, Integer> exhibitionDAO) { 
     super(context, itemView, objects); 
     this.context=context; 
     this.records = new ArrayList<>(objects); 
     this.filterRecords=new ArrayList<>(objects); 
     this.searchFilter=new SearchFilter(); 
     this.exhibitionDAO = exhibitionDAO; 

    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 

     final Exhibition exhibition= records.get(position); 

     if(view==null){ 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view= inflater.inflate(R.layout.museum_list_item_layout,parent,false); 
      viewHolder = new ViewHolder(); 
      view.setTag(viewHolder); 
     }else 
      viewHolder = (ViewHolder) view.getTag(); 
     viewHolder.eventName=(TextView)view.findViewById(R.id.list_item); 
      viewHolder.eventName.setText(exhibition.getName()); 

     return view; 
    } 

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

    @Override 
    public Filter getFilter() { 
     if(searchFilter==null) 
      searchFilter=new SearchFilter(); 
     return searchFilter; 
    } 

    public class ViewHolder{ 
     TextView eventName; 
    } 

    private class SearchFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      List<Exhibition> list; 
      if (constraint == null || constraint.length() == 0){ 
       list = new ArrayList<Exhibition>(records); 
       results.values = list; 
       results.count = list.size();} 
       else{ 
     try{ 

      list = exhibitionDAO.queryBuilder().where().like("name","%"+constraint+"%").query(); 
      synchronized (list){ 
      results.values=list; 
      results.count=list.size();} 
     } 
     catch (SQLException e){e.printStackTrace();}} 
      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      filterRecords = (ArrayList<Exhibition>)results.values; 
      notifyDataSetChanged(); 
      clear(); 
      int count = filterRecords.size(); 

      for(int i = 0; i<count; i++){ 
       add(filterRecords.get(i)); 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
    } 

UPDATE: я решить мою проблему, добавив две функции:

public void addAllItems(List< Exhibition> exhibitions){ 
     records.clear(); 
     records.addAll(exhibitions); 
    } 
    public void addItems(List<Exhibition> exhibitions){ 
     records.addAll(exhibitions); 
    } 

Один из них обновляет все предметы, добавив в список. Я полагаю, это не очень эффективное решение. Буду признателен, если кто-нибудь подскажет мне, как это улучшить.

+0

, что является причинами использования ArrayAdapter в качестве базового класса? 'ArrayAdapter.clear()' является недействительным набором данных, какова точка 'notifyDataSetChanged' раньше? ... такая же история с 'ArrayAdapter.add()' – Selvin

+0

Мне показалось, что я должен удалить все элементы в адаптере через adapter.clear(), а не добавлять новые и уведомлять об изменениях. – Expiredmind

+0

'@Override public int getCount() { return records.size(); } ... public View getView (int position, View view, ViewGroup parent) { final Exhibition exhibition = records.get (position); 'вы не используете стандартную реализацию' AA.getCount' ... и вы не используют 'AA.getItem()' внутри вашей реализации 'AA.getView()', поэтому использование 'AA.clear' и' AA.add' не создает чувства – Selvin

ответ

-1

попробовать это:

filteredList.clear(); 

    adapter.notifyDataSetChanged(); 
+1

Он также мог попытаться встать на его голову ... дело в том, зачем? ... getCount и getView использует 'records', который не связан с' filterList' ... очисткой 'filterList', а затем вызывает' notifyDataSetChanged' вообще не делает смысла ... – Selvin