web-dev-qa-db-fra.com

notifyDataSetChange ne fonctionne pas sur RecyclerView

Je travaille avec le nouveau RecyclerView d'Android, mais je ne parviens pas à actualiser mon adaptateur personnalisé chaque fois que j'appelle l'une des méthodes de "notification".

J'ai essayé d'appeler notifyDataSetChanged, notifyItemRangeInsert et notifyItemInsert et aucun d'entre eux ne semble fonctionner.

Voici le code de mon adaptateur personnalisé. J'essaie essentiellement de rafraîchir une liste de chaînes:

package com.mycompany.myapp.adapters;

import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.LinearLayout;
import Android.widget.TextView;

import com.mycompany.myapp.R;

import Java.util.List;

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {

    private List<String> mDataset;

    public FeedAdapter(List<String> dataset) {
        super();
        mDataset = dataset;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        LinearLayout v = (LinearLayout) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_feed, parent, false);
        v.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
    return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setText(mDataset.get(position));
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    public void setDataset(List<Status> dataset) {
        mDataset = dataset;
        // This isn't working
        notifyItemRangeInserted(0, mDataset.size());
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView mFeedText;

        public ViewHolder(View v) {
            super(v);
            mFeedText = (TextView) v.findViewById(R.id.feed_text);
        }

        private void setText(String text) {
            mFeedText.setText(text);
        }
    }
}

Quelqu'un d'autre a-t-il ce problème?

Merci!

26
wmora

Mon problème était que je ne notifiais pas le changement sur le thread principal, donc le changement n'était pas visible tout de suite. C'est le même problème signalé ici .

26
wmora

J'essayais de mettre à jour RecycleView avec méthode notifyDataSetChanged () en réponse à com.google.common.eventbus.Subscribe.

Comme @wmora l'a mentionné, le problème était que la méthode notify n'était pas appelée dans le thread d'interface utilisateur principal.

Je l'ai résolu avec @UiThread d'AndroidAnnotations

@UiThread
protected void dataSetChanged() {
    notifyDataSetChanged();
}

ce qui équivaut à:

 final Adapter adapter = this;
 new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       adapter.notifyDataSetChanged();
    }
 });

remarque: séparez simplement le nouveau gestionnaire dans le champ privé de la classe