Android刷新适配器工作后再次旋转设备

前端之家收集整理的这篇文章主要介绍了Android刷新适配器工作后再次旋转设备前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我将一些数据添加到“列表模型”中并且在旋转设备上恢复保存的数据时,此代码工作正常,不幸的是,在恢复数据并将其设置为在OnRestoreInstanceState方法之后建模,在添加其他数据后,适配器无法使用新添加的数据刷新,适配器中的数据源可以更新,但适配器可以;不知道他们,我使用MVVM数据模型绑定和搜索更多的时间关于这个问题我无法解决.

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

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);
    }

添加到模型方法

@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,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);
    }
}

我想知道为什么这段代码工作正常:

@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);
    }

没有任何问题,后移动这行:

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 ActivityRegisterPresenter {
    private ActivityRegisterContract view;

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

    ...
}

和我的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;
    }
}

SOURCE CODE IS HERE

问题在clickOnRegisterMobileNumber和clickOnSendCommandToRobot方法

解决方法

我的问题解决了,

在将以下行添加到您为setAdapter的特定活动的manifest中

android:configChanges="screenSize|orientation|screenLayout"

但是,如果您仅在这两种模式下设计“纵向”和“横向”布局或运行应用程序,则会返回最佳视图.

猜你在找的Android相关文章