J'ai une liste qui peut être mise à jour par l'utilisateur, mais notifyDataSetChanged()
ne fonctionne pas sur l'adaptateur associé au listView
. Je l'utilise dans un fragment. La base de données est mise à jour, contrairement à l'adpater. Voici ma mise en œuvre:
Mon principal segment:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myArrayList = new ArrayList<myList>();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
if (myArrayList != null && myArrayList.size() > 0) {
adapter = new myListAdapter(getActivity(), 0, myArrayList);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.mainfragment, container, false);
myListView = (ListView) v.findViewById(R.id.my_list_view);
myListView.setOnItemClickListener(this);
if (adapter != null) {
myListView.setAdapter(adapter);
}
return v;
}
Après certains processus de navigation, List est mis à jour et dans ma méthode onResume()
j'obtiens la liste mise à jour de la base de données et appelle la méthode notifyDatasetChanged()
qui ne met pas à jour ma vue, cependant le tableau correspondant de la base de données est mis à jour un .
@Override
public void onResume() {
super.onResume();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
adapter.setItems (myArrayList);
adapter.notifyDataSetChanged();
}
MyListAdapter
public class MyListAdapter extends ArrayAdapter<Message> {
private ArrayList<Message> myList;
/* Context */
private Context context;
public void setItems (ArrayList<Message> myList) {
this.myList = myList;
}
public MyListAdapter (Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}
@Override
public View getView (int position, View v, ViewGroup parent) {
// Keeps reference to avoid future findViewById()
MyViewHolder viewHolder;
if (v == null) {
LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.list_row, parent, false);
viewHolder = new MyViewHolder();
viewHolder.txtImage = (ImageView) v.findViewById(R.id.message_icon);
viewHolder.txtMessage = (TextView) v.findViewById(R.id.message);
viewHolder.txtDate = (TextView) v.findViewById(R.id.date);
v.setTag(viewHolder);
} else {
viewHolder = (MyViewHolder) v.getTag();
}
Message myMessage = new Message();
myMessage = myList.get(position);
if (myMessage != null) {
viewHolder.txtMessage.setText(myMessage.getText());
viewHolder.txtDate.setText(myMessage.getDate());
}
return v;
}
static class MyViewHolder {
ImageView txtImage;
TextView txtMessage;
TextView txtDate;
}
}
Avez-vous pensé à ce qui ne va pas? Pourquoi la liste des vues n'est-elle pas mise à jour? Toute aide est appréciée.
notifyDataSetChanged()
ne fonctionnera pas pour vous. Raisons pour lesquelles
Toujours créer et ajouter une nouvelle liste à l'adaptateur. Faites comme ceci: initialisez ArrayList tout en déclarant globalement.
ArrayList<myList> myArrayList=new ArrayList<myList>();
// en tant que variable globale
Ajoutez List à l'adaptateur directement sans vérifier la condition nulle et vide. Réglez l'adaptateur directement sur la liste (ne vérifiez aucune condition)
myListView.setAdapter(adapter);
Ajouter des données à myArrayList à chaque fois (si vos données sont complètement nouvelles, vous pouvez appeler adapter.clear () et myArrayList.clear () avant d'ajouter réellement des données à la liste) mais ne définissez pas l'adaptateur, c'est-à-dire si les nouvelles données sont rempli dans myArrayList que simplement adapter.notifyDataSetChanged()
adapter = new myListAdapter(getActivity(), 0, myArrayList);
Supprimer cette ligne
adapter.setItems (myArrayList);
Méthode getCount juste dépassée
@Override
public int getCount() {
return myArrayList.count();
}
Dans votre méthode setItems, essayez de supprimer l'ancien ArrayList.
au lieu de cela:
public void setItems(ArrayList<Message> myList) {
this.myList = myList;
}
Essaye ça:
public void setItems(ArrayList<Message> myList) {
this.myList.clear();
this.myList.addAll(myList);
notifyDataSetChanged();
}
Le problème est dans le constructeur de MyListAdapter
Au lieu de
public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, scheduledMessageList);
this.context = context;
this.myList = myList;
}
essayer
public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}
vous devez également appeler adapter.clear();
au lieu de votre propre ensemble de méthodes, puis adapter.addAll(myArrayList);