Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

notifyDataSetChange not working on RecyclerView [duplicate]

I'm working with Android's new RecyclerView but I can't get my custom adapter to refresh whenever I call one of the "notify" methods.

I've tried calling notifyDataSetChanged, notifyItemRangeInserted and notifyItemInserted and none of them seem to work.

Here's the code for my custom adapter. I'm basically trying to refresh a list of Strings:

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

Anyone else having this issue?

Thanks!

like image 811
wmora Avatar asked Jun 30 '14 17:06

wmora


People also ask

What does notifyDataSetChanged do in RecyclerView?

notifyDataSetChanged. Notify any registered observers that the data set has changed. There are two different classes of data change events, item changes and structural changes. Item changes are when a single item has its data updated but no positional changes have occurred.

How many times onCreateViewHolder is called in RecyclerView?

By default it have 5. you can increase as per your need. Save this answer.

What happens when we call notifyDataSetChanged?

notifyDataSetChanged() was called. all Adapter subclasses Adapter reference must call notifyDataSetChanged() when their underlying data has changed, to let the observing view (ListView and such) know that it should refresh itself because the data changed / there is new data.

When onCreateViewHolder is Called?

onCreateViewHolder is called when you need a new View. If there is an available Recycled View that can be provided and be bound with new data, then onBindViewHolder is called :) 96.


2 Answers

My issue was that I was not notifying the change on the main thread, therefore the change was not visible right away. It is the same issue pointed out here.

like image 164
wmora Avatar answered Oct 21 '22 01:10

wmora


I was trying to update RecycleView with notifyDataSetChanged() method in response to com.google.common.eventbus.Subscribe.

Like @wmora mentioned the problem was that the notify method was not called in the main UI thread.

I resolved it with AndroidAnnotations' @UiThread

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

which is equivalent to:

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

note: just separate new Handler into class private field

like image 11
kosiara - Bartosz Kosarzycki Avatar answered Oct 21 '22 02:10

kosiara - Bartosz Kosarzycki