notifyDataSetChange 不适用于 RecyclerView [重复]
Posted
技术标签:
【中文标题】notifyDataSetChange 不适用于 RecyclerView [重复]【英文标题】:notifyDataSetChange not working on RecyclerView [duplicate] 【发布时间】:2014-08-21 03:27:52 【问题描述】:我正在使用 android 的新 RecyclerView,但每当我调用“通知”方法之一时,我都无法让我的自定义适配器刷新。
我尝试调用 notifyDataSetChanged、notifyItemRangeInserted 和 notifyItemInserted,但它们似乎都不起作用。
这是我的自定义适配器的代码。我基本上是在尝试刷新字符串列表:
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);
还有其他人有这个问题吗?
谢谢!
【问题讨论】:
您能否展示您的RecyclerView
和Adapter
作业?
【参考方案1】:
我的问题是我没有在主线程上通知更改,因此更改不是立即可见的。与here 指出的问题相同。
【讨论】:
这是关于 RecyclerView 多么棒的观察!你拯救了我的一天。 谢谢。我的问题是我从另一个线程更改了图像视图。【参考方案2】:我试图用 notifyDataSetChanged() 方法 更新 RecycleView 以响应 com.google.common.eventbus.Subscribe。
就像@wmora 提到的那样,问题是在主 UI 线程中没有调用 notify 方法。
我用 AndroidAnnotations 的@UiThread 解决了它
@UiThread
protected void dataSetChanged()
notifyDataSetChanged();
相当于:
final Adapter adapter = this;
new Handler(Looper.getMainLooper()).post(new Runnable()
@Override
public void run()
adapter.notifyDataSetChanged();
);
注意:只需将新的处理程序分离到类私有字段中
【讨论】:
我遇到了关于 RecyclerView 的问题。当我添加项目时,它不会显示在列表中。当我旋转屏幕时,由于重新创建了页面,因此会显示新添加的项目。我所做的是,当我单击添加按钮时,我添加项目并调用 adapter.notifyDataSetChanged(); 该注解是仅用于代码正确性的标记。它不等同于发布到处理程序。以上是关于notifyDataSetChange 不适用于 RecyclerView [重复]的主要内容,如果未能解决你的问题,请参考以下文章
ArrayAdapter.NotifyDataSetChanged() 不工作?
Android RecyclerView:notifyDataSetChanged() IllegalStateException
[完成]notifyDataSetChanged() 不会自动更新 ListActivity