再次轮换设备后Android刷新适配器工作 [英] Android refreshing adapter work after rotation again device
问题描述
当我向列表模型"中添加一些数据并在旋转设备上恢复保存的数据时,不幸的是,在恢复数据并将其添加到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;
}
}
问题在clickOnRegisterMobileNumber
和clickOnSendCommandToRobot
方法中
推荐答案
我的问题已解决,
将以下行添加到清单中以设置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屋!