我在AppCompatActivity
内有RecyclerView
。在旋转设备后,会显示项目插入和更改并正确动画。使用打开的DialogFragment旋转设备后,RecyclerView不刷新
问题发生在你:对在RecyclerView
项目
- 点击。
- A
DialogFragment
打开提示,如果你想删除该项目。 - 旋转设备。
- 确认对话框中的删除。
- 检查数组列表。该项目已被删除。
RecyclerView
仍显示该项目。
使用notifyDataSetChanged
代替notifyItemRemoved
试过,但没有工作,要么是因为仍在于RecyclerView
所示的项目。
任何版本的Android都会发生这种情况。
简化的过程如何被处理的代码:
public class MyAppCompatActivity extends AppCompatActivity {
int positionOfDeletedItem;
MyObjectRecyclerViewAdapter adapter;
ArrayList<MyObject> someTestData;
MyItemDeletionHandler deletionHandlerRemover;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity_layout);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
positionOfDeletedItem = 1;
deletionHandlerRemover = new MyItemDeletionHandler(this);
someTestData = new ArrayList<MyObject>(3);
someTestData.add(new MyObject("A"));
someTestData.add(new MyObject("B"));
someTestData.add(new MyObject("C"));
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyObjectRecyclerViewAdapter(new MyAdapterOnClickEvent.OnItemClick() {
@Override
public void onClick(int posicion, int idViaje, View view) {
String tag = "Some tag value";
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag(tag);
if(prev != null)
ft.remove(prev);
ft.addToBackStack(null);
DialogFragment newFragment = MyDeletionConfirmationDialog.newInstance(deletionHandlerRemover);
newFragment.show(ft, tag);
}
}, someTestData);
recyclerView.setAdapter(adapter);
}
private final static class MyItemDeletionHandler extends Handler {
private final WeakReference<MyAppCompatActivity> theActivity;
private MyItemDeletionHandler(MyAppCompatActivity act) {
theActivity = new WeakReference<MyAppCompatActivity>(act);
}
@Override
public void handleMessage(Message msg) {
MyAppCompatActivity activity = theActivity.get();
if(activity != null) {
if(msg.what == 1) {
activity.deleteTheItem();
}
}
}
}
public void deleteTheItem() {
someTestData.remove(positionOfDeletedItem);
adapter.notifyItemRemoved(positionOfDeletedItem);
}
}
public class MyDeletionConfirmationDialog extends DialogFragment {
private Message handlerMessage;
public static MyDeletionConfirmationDialog newInstance(Handler callbackHandler) {
MyDeletionConfirmationDialog myDialog = new MyDeletionConfirmationDialog();
Bundle args = new Bundle();
args.putParcelable("handlerMessage", callbackHandler.obtainMessage(1, true));
myDialog.setArguments(args);
return myDialog;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handlerMessage = getArguments().getParcelable("handlerMessage");
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
alertDialogBuilder.setMessage("Some message");
alertDialogBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
final Message toSend = Message.obtain(handlerMessage);
toSend.sendToTarget();
}
});
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog dialog = alertDialogBuilder.create();
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}
我怎样才能获得RecyclerView
正常工作?
编辑1:
我有其他RecyclerView
S IN此工作正常。唯一的区别是在Fragment
s之内,而不是AppCompatActivity
。我怀疑这与RecyclerView
的事件onDetachedFromWindow
和onAttachedToWindow
有关。
编辑2:
如果对话框被关闭(步骤4),并再次打开它按预期工作。
编辑3:
如果RecyclerView
被提取为Fragment
问题消失,按预期工作。上述用例与AppCompatActivity
而不是Fragment
一起正确工作是不可能的。
当你点击对话框时,它应该消失并删除列表中的项目。那么当您更改方向并删除数据时,对话如何保留? –
@ReazMurshed用例如下:单击一个项目将其删除。它显示一个确认对话框('取消'和'删除')。您不要点击任何选项。您旋转设备。该对话框仍然打开。然后选择“删除”选项删除该项目。对话框关闭。该项目已从数据库中删除。 'RecyclerView'没有相应更新,它仍然显示已删除的项目。 – OneEyeQuestion
这不是一个合适的解决方案,但无论如何,这个黑客可以做你想要的伎俩。 您可以在'onConfigurationChange'中轻松检测方向变化,并可以关闭屏幕上显示的对话框。 屏幕上显示的对话与活动/片段生命周期无关,因此它仍然保留在屏幕上。 –