[英]How do I communicate between ListFragment and DialogFragment where the DialogFragment is invoked via the options menu of list fragment?
我有一個實現ListFragment的“ ListFrag”類,在該類中,我有一個嵌套的靜態DialogFragment類“ SortDialogFragment”,可通過選項菜單中的一個選項調用。 對話框的目的是向用戶提供有關他們希望列表如何排序的選項集。 我能夠很好地顯示對話框,並且用戶能夠選擇該選項。 但是,我不確定在用戶做出選擇后,如何從DialogFragment類訪問listview的“ notifyDataSetChanged”方法時如何刷新listview。 我確實知道使用接口通過基礎活動在兩個片段之間進行通信,但是我不清楚如何在這種特殊情況下應用該技術。 我不確定在哪里定義我的接口,以及誰將實現該接口。 由於我是新手Android開發人員,因此也請耐心等待,並且在發布查詢方面也請訪問此網站。 以下是我修改的代碼,僅包含相關代碼:
public class ListFrag extends SherlockListFragment {
private ListFragListener myListener;
private DatabaseAdapter database;
private ArrayList<MyObject> listItems;
private View layout;
private Button confirmBtn;
private Button cancelBtn;
private boolean isDeleteActive;
private boolean isExportActive;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
layout = inflater.inflate(R.layout.list_frag, container, false);
return layout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
database = DatabaseAdapter.getInstance(getActivity());
database.open();
listItems = database.getMyObjects();
database.close();
setHasOptionsMenu(true);
registerForContextMenu(this.getListView());
final MyAdapter listAdapter = new MyAdapter(getActivity(), listItems);
setListAdapter(listAdapter);
confirmBtn = (Button) layout.findViewById(R.id.itemDelete);
cancelBtn = (Button) layout.findViewById(R.id.itemCancel);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.listview_omenu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
int itemId = item.getItemId();
if (itemId == R.id.listOMItem3) {
SortDialogFragment sortDialog = SortDialogFragment.newInstance(listItems);
sortDialog.show(getFragmentManager(), "Sort Dialog");
}
return true;
}
public static class SortDialogFragment extends SherlockDialogFragment {
public static SortDialogFragment newInstance(ArrayList<MyObject> objectsToSort) {
SortDialogFragment sortDialog = new SortDialogFragment();
Bundle args = new Bundle();
args.putParcelableArrayList("MyObjects to sort", objectsToSort);
sortDialog.setArguments(args);
return sortDialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final ArrayList<MyObjects> objectsToSort = getArguments().getParcelableArrayList("MyObjects to sort");
builder.setTitle("Sort objects by...");
builder.setSingleChoiceItems(R.array.sortDialogOptions, checkedItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if (which == 0) {
Collections.sort(objectsToSort, new ComparatorOne());
} else if (which == 1) {
Collections.sort(objectsToSort, new ComparatorTwo());
} else {
Collections.sort(objectsToSort, new ComparatorThree());
}
?????????????????????????????????????
// This is where I am trying to refresh the list before dismissing the dialog but I
// I apparently do not have access to listview's adapter to call the "notifyDataSetChanged" method.
dialog.dismiss();
}
});
builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return builder.create();
}
}
}
首先,刷新列表視圖時,必須在為列表視圖設置的適配器上調用notifyDataSetChanged
。 首先將final MyAdapter listAdapter
更改為字段而不是變量。
下一步是將適配器傳遞給對話框的構造函數,並將其存儲在字段中。 您的SortDialogFragment
的標題應如下所示:
public static class SortDialogFragment extends SherlockDialogFragment {
private MyAdapter mAdapter;
public static SortDialogFragment newInstance(ArrayList<MyObject> objectsToSort, MyAdapter adapter) {
SortDialogFragment sortDialog = new SortDialogFragment();
sortDialog.setAdapter(adapter);
Bundle args = new Bundle();
args.putParcelableArrayList("MyObjects to sort", objectsToSort);
sortDialog.setArguments(args);
return sortDialog;
}
public void setAdapter (MyAdapter adapter){
mAdapter = adapter;
}
(...)
在創建SortDialogFragment時,下一步傳遞適配器。 應該看起來像這樣:
SortDialogFragment sortDialog = SortDialogFragment.newInstance(listItems, listAdapter);
最后,您只需要調用mAdapter.notifyDataSetChanged();
在????????????????
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.