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.
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
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
'@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