【发布时间】:2017-10-09 04:40:22
【问题描述】:
当我将一些数据添加到“列表模型”并恢复旋转设备上保存的数据时,此代码工作正常,不幸的是,在恢复数据并将其设置为onRestoreInstanceState 方法中的model 之后,在添加其他数据后,适配器无法用新添加的数据刷新,适配器中的数据源可以更新,但适配器不知道它们,我正在使用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);
}
添加到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);
}
}
我想知道为什么这段代码可以正常工作:
@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;
}
}
问题出在clickOnRegisterMobileNumber 和clickOnSendCommandToRobot 方法中
【问题讨论】:
-
所以旋转是问题所在?
-
@Remario 在更改设备旋转并使用
clickOnSendCommandToRobot方法添加更多项目后。我在适配器上看不到它们,但再次旋转设备后,我在适配器上看到它们 -
@Remario 我的帖子已更新
-
好吧,给我一些时间,很快就会给出答案!
-
@Remario 非常感谢,你想和我一起获取源代码吗?