当前位置: 首页 > 知识库问答 >
问题:

Android RecyclerView不更新更改的数据

桓喜
2023-03-14

RecycerView只显示创建时ArrayList(适配器的数据)中的项。我所有添加更多行的尝试似乎都奏效了,但列表仍然是初始数据。它不是重复的,因为我尝试了谷歌上找到的所有建议。我已经做了什么:

  • Adapter.NotifyDataSetChanged();
  • Adapter.NotifyItemChanged(5);
  • recyleList.invalidate();
  • recyclelist.setAdapter(适配器);
  • 使用处理程序在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);
    }
}
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();
}

共有1个答案

厉钊
2023-03-14
try this

In Fragment
ArrayList<Data> items=new ArrayList<>();

items.addAll(initialItems);
adapter = new MyListAdapter(getContext(),items);
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
            items.addAll(freshData);
            adapter.notifyDataSetChanged();
            followList.invalidate();

        }
    });
}



private Context mContext;
private ArrayList<Model> data;

public MyListAdapter(Context mContext,ArrayList<Model> data) {
    this.mContext = mContext;
    this.data=data;
}

@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 class ViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.textName) TextView textName;

    public ViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
    }
}
 类似资料:
  • UserViewModel: 用户存储库:

  • 问题内容: 我有一个ng-repeat,它在更改正在使用的数组中的数据时不会更新。我已经研究了一段时间,但似乎没有任何效果。最初,当页面加载时,ng- repeat显示数据集的第一页,在获取新数据(下一页)并使用该数据设置该数组时,ng- repeat不会注意到更改,并且永远不会填充更新的数组。如果有人可以在正确的方向上指导我,将不胜感激。 }]); 问题答案: 尝试将tbody包装在div中,但

  • 这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。

  • 我是Flutter的新手,面临着StreamBuilder的问题 我在点击卡片列表中可用的按钮(应用按钮)时进行网络呼叫,基于显示的其他按钮。 我面临的问题是,小部件不更新成功的网络调用后,但当我刷新页面我得到更新的结果。 我做错了什么? 我没有在这方面使用任何状态。我需要用它吗? //下面是我如何将数据添加到流中的 预期结果:当我进行网络呼叫时,如果成功,那么根据网络结果,其他按钮必须显示在相应

  • 问题内容: 我目前正在尝试弄清楚如何在不重新加载整个页面的情况下更改路由参数。例如,如果我从 http://www.example.com/#/page 但将名称更新为“乔治”,将路线更改为: http://www.example.com/#/page/george 如果我已经路由了http://www.example.com/#/page/:name。 无需重新加载位置。可以只设置$ route

  • 问题内容: 是否可以在sql中执行更新语句,但仅在更新不同时才执行更新? 例如 如果在数据库中, 不应 执行任何类型的更新 但是,如果 这 应该 执行更新。 问题答案: 使用更新前触发器可以做到这一点。在此触发器中,您可以将旧值与新值进行比较,并在新值不变的情况下取消更新。但这将导致呼叫者网站上的错误。 我不知道为什么要这样做,但是这里有几种可能性: 性能:这里没有性能提升,因为更新不仅需要找到正