簡體   English   中英

如何通過列表片段的選項菜單調用DialogFragment的ListFragment和DialogFragment之間進行通信?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM