RecyclerView中的notifyDataSetChange无效

26

我正在使用Android的新RecyclerView,但是当我调用任何一个“notify”方法时,我的自定义适配器无法刷新。

我尝试过调用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的分配吗? - nhaarman
2个回答

26

我的问题在于我没有在主线程上通知变更,因此更改并不会立即显示。这是此处指出的相同问题。


2
这是关于RecyclerView的内容。 - Boy
2
观察得真仔细!你救了我的一天。 - Rohit Mandiwal
谢谢。我的问题是我从另一个线程更改了一个ImageView。 - momvart

11

我尝试使用notifyDataSetChanged()方法响应com.google.common.eventbus.Subscribe更新RecycleView。

正如@wmora所提到的,问题在于没有在主UI线程中调用通知方法。

我使用AndroidAnnotations的@UiThread解决了这个问题。

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

等同于:

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

注意: 只需将新的Handler单独分离到类私有字段中


我遇到了关于RecyclerView的问题。当我添加项目时,它不会显示在列表中。当我旋转屏幕时,由于页面被重新创建,新添加的项目将被显示。我的做法是,当我点击添加按钮时,我添加该项并调用adapter.notifyDataSetChanged(); - prakashpun
1
那个注解仅用于代码的正确性标记,它并不等同于发布到处理程序。 - Jeffrey Blattman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接