2016-09-22 2 views
-1

Je souhaite actualiser mon adaptateur dans deux situations, mais rien ne se passe. D'abord, j'ai essayé appeléL'adaptateur ne rafraîchit pas

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

La seconde j'ai essayé rafraîchir dans mon filtre par notifyDataSetInvalidated();

ma classe Adaptateur:

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

MISE À JOUR: Je résolu mon problème en ajoutant deux fonctions:

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

On rafraîchit tous les éléments le second s'ajoutant à la liste. Je suppose que ce n'est pas une solution très efficace. Je serai reconnaissant si quelqu'un me donne un indice comment améliorer cela.

+0

ce qui est une des raisons de l'utilisation ArrayAdapter comme classe de base? 'ArrayAdapter.clear()' invalide un ensemble de données, quel est le point de 'notifyDataSetChanged' avant? ... même histoire avec 'ArrayAdapter.add()' – Selvin

+0

je pensais que je devrais effacer tous les éléments dans l'adaptateur par adaptateur.clear() que d'ajouter un nouveau et notifier les changements. – Expiredmind

+0

'@Override public int getCount() { Renvoie records.size(); } ... public Voir getView (position int, View view, ViewGroup parent) { final Exposition exhibition = records.get (position); 'vous n'utilisez pas l'implémentation par défaut de' AA.getCount' ... et vous n'utilisez pas 'AA.getItem()' dans votre implémentation 'AA.getView()' ... donc utiliser 'AA.clear' et' AA.add' ne font pas sens – Selvin

Répondre

-1

essayez ceci:

filteredList.clear(); 

    adapter.notifyDataSetChanged(); 
+1

Il pourrait également essayer de se tenir sur sa tête ... le point est: pour quoi faire? ... getCount et getView utilisent 'records' qui n'est pas connecté avec' filteredList' ... effacer 'filteredList' et ensuite appeler' notifyDataSetChanged' n'a aucun sens ... – Selvin