web-dev-qa-db-ja.com

notifyDataSetChangedがRecyclerViewで機能しない

Androidの新しいRecyclerViewを使用していますが、「notify」メソッドの1つを呼び出すたびにカスタムアダプターを更新することはできません。

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

この問題を抱えている人はいますか?

ありがとう!

26
wmora

私の問題は、メインスレッドで変更を通知していないため、変更がすぐに表示されないことでした。 here と指摘されているのと同じ問題です。

26
wmora

com.google.common.eventbus.Subscribeに応じてnotifyDataSetChanged()メソッドでRecycleViewを更新しようとしました。

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

注:新しいハンドラーをクラスのプライベートフィールドに分離するだけです