web-dev-qa-db-de.com

notifyDataSetChange funktioniert in RecyclerView nicht

Ich arbeite mit dem neuen RecyclerView von Android, kann meinen benutzerdefinierten Adapter jedoch nicht aktualisieren, wenn ich eine der Benachrichtigungsmethoden aufrufe.

Ich habe versucht, notifyDataSetChanged, notifyItemRangeInserted und notifyItemInserted aufzurufen, und keiner von ihnen scheint zu funktionieren.

Hier ist der Code für meinen benutzerdefinierten Adapter. Ich versuche im Grunde eine Liste von Strings zu aktualisieren:

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

Hat noch jemand dieses Problem?

Vielen Dank!

26
wmora

Mein Problem war, dass ich die Änderung nicht im Haupt-Thread gemeldet habe, daher war die Änderung nicht sofort sichtbar. Es ist das gleiche Thema, auf das hingewiesen wird hier .

26
wmora

Ich habe versucht, RecycleView mit der Methode notifyDataSetChanged () als Antwort auf com.google.common.eventbus.Subscribe zu aktualisieren.

Wie bereits bei @wmora erwähnt, bestand das Problem darin, dass die Benachrichtigungsmethode im Haupt-UI-Thread nicht aufgerufen wurde.

Ich habe es mit AndroidAnnotations '@UiThread gelöst

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

was äquivalent ist zu:

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

hinweis: Trennen Sie den neuen Handler einfach in das Feld class private