【发布时间】:2017-08-31 09:09:33
【问题描述】:
RecyclerView 仅显示创建时 ArrayList(适配器的数据)中的项目。我添加更多行的所有尝试似乎都有效,但列表保留了初始数据。 它不是重复的,因为我尝试了在谷歌上找到的所有建议。 我已经做了什么:
- adapter.notifyDataSetChanged();
- adapter.notifyItemChanged(5);
- recycleList.invalidate();
- recycleList.setAdapter(适配器);
- 使用 Handler 在 UIThread 上运行更新
适配器正常工作 - onCreateView 可以正常工作(创建新行)以及 onBindView(绑定新数据)。 getItemCount() 返回正确的值(更新后更大)。一切看起来应该是 - 而不是最终视图 - 没有改变。
唯一可行的方法是使用新数据集从头开始重新创建适配器 - 设计上完全不可接受(长列表很难看)。
代码如下:
在片段中创建:
adapter = new MyListAdapter(getContext());
adapter.addItems(initialItems); // These and only these I see on the list
LinearLayoutManager mLayoutManager=new LinearLayoutManager(getContext());
recycleList.setLayoutManager(mLayoutManager);
recycleList.setAdapter(adapter);
尝试从片段更新:
public void onUpdateReady(ArrayList<Model> freshData) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() { // UI thread
adapter.addItems(freshData);
adapter.notifyDataSetChanged();
adapter.notifyItemChanged(5);
recycleList.invalidate();
//notifyItemRangeInserted(3,freshData.size());
}
});
}
适配器:
private Context mContext;
private ArrayList<Model> data;
public MyListAdapter(Context mContext) {
this.mContext = mContext;
data=new ArrayList<>();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.textName.setText(data.get(position).getName());
}
@Override
public int getItemCount() {
return data.size();
}
public void addItems(Collection<Model> list) {
data.addAll(list);
}
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.textName) TextView textName;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
}
}
更新:根据 cmets 更改:
public void addItems(Collection<Model> list) {
ArrayList<Model> newData=new ArrayList<>(); // Make new array
newData.addAll(data); // Take old
newData.addAll(list); // Add new
data=newData; // change to data to newly created array
notifyDataSetChanged();
}
【问题讨论】:
-
在这里看看我的回答:stackoverflow.com/a/38568013/5223744
-
不要将项目直接添加到您的适配器,将项目添加到 arraylist 并将该列表传递给您的适配器,以及每当您调用 adapter.notifyDataSetChanged();它将反映到您的回收站视图
-
之前的评论有误。你有相同的arraylist 地址。不需要在类之外重新分配值。
-
照你说的做了。更改了 addItems(请参阅帖子中的更新)。但不幸的是,没有任何改变。仍然看到旧行 - 即使我执行 data.clear() - 初始行仍然没有数据。换句话说 - 没有更新。
-
getItemCount会在notifyDataSetChanged()之后被解雇吗?
标签: android android-recyclerview notifydatasetchanged