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!
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.
By default it have 5. you can increase as per your need. Save this answer.
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With