web-dev-qa-db-fra.com

ArrayAdapter.NotifyDataSetChanged () ne fonctionne pas?

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.

18
Usama Sarwar

notifyDataSetChanged() ne fonctionnera pas pour vous. Raisons pour lesquelles

  1. Votre adaptateur perd la référence à votre liste.
  2. 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);

  3. 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);
    
  4. Supprimer cette ligne

    adapter.setItems (myArrayList);

30
Pragnani

Méthode getCount juste dépassée

    @Override
    public int getCount() {
        return myArrayList.count();
    }
8
hovo888s

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

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

0
Yalla T.