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

还有其他人有这个问题吗?

谢谢!

【问题讨论】:

您能否展示您的RecyclerViewAdapter 作业? 【参考方案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() 不工作?

notifyDataSetChanged 示例

Android RecyclerView:notifyDataSetChanged() IllegalStateException

[完成]notifyDataSetChanged() 不会自动更新 ListActivity

notifyDataSetChanged() 上的 WinDeath

安卓:notifyDataSetChanged();不工作