我在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'中輕鬆檢測方向變化,並可以關閉屏幕上顯示的對話框。 屏幕上顯示的對話與活動/片段生命週期無關,因此它仍然保留在屏幕上。 –