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);
}
}
}
この問題を抱えている人はいますか?
ありがとう!
私の問題は、メインスレッドで変更を通知していないため、変更がすぐに表示されないことでした。 here と指摘されているのと同じ問題です。
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();
}
});
注:新しいハンドラーをクラスのプライベートフィールドに分離するだけです