【问题标题】:Android update recyclerView itemsAndroid更新recycler查看物品
【发布时间】:2017-04-07 03:18:27
【问题描述】:

我在通过新数据更新 recyclerview 项目时遇到简单的问题,我想知道哪些代码在不使用数据绑定的情况下可以正常工作,在我的代码中通过单击按钮作为 clickOnSendCommandToRobot 方法触发添加新项目,此方法必须将新项目添加到List,我的适配器可以知道要添加新数据并刷新RecyclerView,我没有收到任何错误,但列表大小始终为1

public class ActivityRegister extends BaseActivities {
    private RobotMessagesAdapter adapter;
    private List<RobotViewModel> model;
    private static final String TAG = "register";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_register);

        ActivityRegisterPresenter presenter = new ActivityRegisterPresenter(this);
        ActivityRegisterViewModel viewModel = new ActivityRegisterViewModel();
        binding.setViewModel(viewModel);
        binding.setPresenter(presenter);

        if (savedInstanceState == null) {
            model = new ArrayList<>();
        } else {
            model = savedInstanceState.getParcelableArrayList("model");
        }
        adapter = new RobotMessagesAdapter(this, model);
        binding.registerRobot.setAdapter(adapter);

        ...
    }
    @Override
    public void clickOnSendCommandToRobot() {
        RobotViewModel temp = new RobotViewModel();
        temp.setMessage(Math.round(Math.random()) + "");
        temp.setMessageType(SV.RobotMessageType.SENT_BY_ROBOT.ordinal());
        model.add(temp);

        Log.e(TAG, model.size() + "");

        adapter.setData(model);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putParcelableArrayList("model", (ArrayList) model);
        super.onSaveInstanceState(outState);
    }
}

适配器setData 方法:

public void setData(List<RobotViewModel> data) {
    Log.e("data size ", data.size() + "");
    list.clear();
    list.addAll(data);
    notifyDataSetChanged();
}

每次点击按钮并触发clickOnSendCommandToRobot 方法。 model 变量清除,我没有最新添加的项目,适配器不会通过新添加的项目刷新列表。 日志猫:

04-08 08:29:45.342 21470-21470/com.sample.myapp E/register: 1
04-08 08:29:45.343 21470-21470/com.sample.myapp E/data size: 1
04-08 08:29:46.658 21470-21470/com.sample.myapp E/register: 1
04-08 08:29:46.658 21470-21470/com.sample.myapp E/data size: 1
04-08 08:29:47.462 21470-21470/com.sample.myapp E/register: 1
04-08 08:29:47.462 21470-21470/com.sample.myapp E/data size: 1

【问题讨论】:

  • 删除 list.clear() 然后尝试。而不是它,我认为它们在代码中没有问题。
  • @KeyurThumar 帖子已更新,请查看,谢谢
  • @MikeM。是的,先生,我敢肯定,当我不使用数据绑定功能时,这段代码可以正常工作

标签: android android-recyclerview


【解决方案1】:

因为模型是对回收器视图适配器本身的引用,所以对外部模型对象所做的任何更改都会链接回适配器。因此,在模型所在的适配器类之外,调用 notifyDataSetChange 那里。所以 adapter.setData(model); 删除和只需做adapter.notifyDatasetChange();

 @Override
    public void clickOnSendCommandToRobot() {
        RobotViewModel temp = new RobotViewModel();
        temp.setMessage(Math.round(Math.random()) + "");
        temp.setMessageType(SV.RobotMessageType.SENT_BY_ROBOT.ordinal());
        model.add(temp);

        Log.e(TAG, model.size() + "");

        adapter.notifyDataSetChanged();        }

【讨论】:

  • 删除 list.clear(); 导致重复项目,我从适配器中删除 notifyDataSetChanged 并将其移动到您的代码等活动中,adapter.notifyDataSetChanged(); 不幸的是问题没有解决并导致清除 model 内容在每个触发方法上
  • 什么,你删除了设置数据的调用
  • 问题似乎解决了,但我有一个问题,适配器在哪里可以知道数据更改?我使用adapter.setData(model); 将项目添加到适配器
  • 我通常做的是在我更改任何与适配器相关的任何内容之前,首先调用 adapter.getItemCount() ,然后在更改后调用它,然后比较是否有差异,然后就可以了。有意义吗?
  • 你能帮我解决这个问题吗? stackoverflow.com/q/43894042/6596724提前致谢
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多