再次轮换设备后Android刷新适配器工作 [英] Android refreshing adapter work after rotation again device

查看:57
本文介绍了再次轮换设备后Android刷新适配器工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我向列表模型"中添加一些数据并在旋转设备上恢复保存的数据时,不幸的是,在恢复数据并将其添加到onRestoreInstanceState方法中的model之后,向其中添加了其他数据,此代码可以正常工作适配器无法使用新添加的数据刷新,适配器中的数据源可以进行更新,但是适配器不知道;我正在使用MVVM数据模型绑定并搜索更多有关此问题的时间,无法解决这个问题.

This code works fine when i add some data into 'List model' and restore saved data on rotation device, unfortunately after restore data and set that to model within onRestoreInstanceState method, after adding other data to that, adapter could not refresh with new added data, data source in adapter after can be updated, but adapter can;t know them , I'm using MVVM data model binding and search more time about this problem i can't resolve that.

有个简单的提示,再次旋转设备后,我的适配器可以使用所有添加的数据刷新,而适配器不使用它们刷新.

Rhat have a simple tip which after rotation again device, my adapter can be refresh with all added data which adapter don't refresh with them.

public class ActivityRegister extends BaseActivities{
    private  List<RobotViewModel> model  = new ArrayList<>();
    ...
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putParcelable("model", Parcels.wrap(model));
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle outState) {
        model = Parcels.unwrap(outState.getParcelable("model"));

        adapter.setData(model);
        adapter.notifyItemInserted(model.size() - 1);
        binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
    }

添加到model方法:

    @Override
    public void clickOnSendCommandToRobot() {
        RobotViewModel temp = new RobotViewModel();

temp.setMessage("message");

        temp.setCommand(true);

        model.add(temp);

        adapter.notifyItemInserted(model.size() - 1);
        binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
    }

我的适配器类:

public class RobotMessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<RobotViewModel> list;
    private LayoutInflater       inflater;

    public RobotMessagesAdapter(List<RobotViewModel> robotViewModels) {
        this.list = robotViewModels;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (inflater == null) {
            inflater = LayoutInflater.from(parent.getContext());
        }
        if (viewType == SV.RobotMessageType.SENT_BY_USER.ordinal()) {
            return new UserViewHolder(UserMessagesDataBinding.inflate(inflater, parent, false));
        } else {
            return new RobotViewHolder(RobotDataBinding.inflate(inflater, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case 0:
                ((UserViewHolder) holder).bind(list.get(position));
                break;
            case 1:
                ((RobotViewHolder) holder).bind(list.get(position));
                break;
        }
    }

    ...

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

我想知道为什么此代码可以正常工作:

I'm wondering why this code work fine:

    @Override
    protected void onRestoreInstanceState(Bundle outState) {
        model = Parcels.unwrap(outState.getParcelable("model"));

        adapter.setData(model);
        adapter.notifyItemInserted(model.size() - 1);
        binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);

        RobotViewModel temp = new RobotViewModel();

temp.setMessage("message");

        temp.setCommand(true);

        model.add(temp);

        adapter.notifyItemInserted(model.size() - 1);
        binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
    }

没有问题,移动此行之后:

without any problem and after move this lines:

        RobotViewModel temp = new RobotViewModel();

temp.setMessage("message");

        temp.setCommand(true);

        model.add(temp);

        adapter.notifyItemInserted(model.size() - 1);
        binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);

转到其他无效的方法:|

to other method that doesn't work :|

我的主持人:

public class ActivityRegisterPresenter {
    private ActivityRegisterContract view;

    public ActivityRegisterPresenter(ActivityRegisterContract mView) {
        view = mView;
    }

    ...
}

和我的ViewModel:

and my ViewModel:

public class ActivityRegisterViewModel extends BaseObservable {
    private String readContactPermission;
    private String getMessages;

    public ActivityRegisterViewModel() {
    }

    @Bindable
    public String getReadContactPermission() {
        return readContactPermission;
    }

    public void setReadContactPermission(String readContactPermission) {
        this.readContactPermission = readContactPermission;
        notifyChange();
    }

    public String getGetMessages() {
        return getMessages;
    }

    public void setGetMessages(String getMessages) {
        this.getMessages = getMessages;
    }
}

此处是源代码

问题在clickOnRegisterMobileNumberclickOnSendCommandToRobot方法中

推荐答案

我的问题已解决,

将以下行添加到清单中以设置setAdapter的特定活动后

after adding this below line into manifest for specific activity where you setAdapter

android:configChanges="screenSize|orientation|screenLayout" 

但是,如果同时设计纵向"和横向"布局或仅以这两种模式中的一种模式运行应用程序,它将返回最佳视图.

But it will return best view if you design Both Portrait and Landscape layout or running app only in one mode of these both.

这篇关于再次轮换设备后Android刷新适配器工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆