如何在BaseAdapter中添加DialogFragment?

时间:2015-11-04 19:42:03

标签: android baseadapter dialogfragment

您好我已经环顾四周,并且无法找到问题的明确答案。我有一个custom adapterBaseAdapter,我与ListActivity一起使用。在每个适配器项的视图中,我想添加一个checkbox,当clicked启动dialog fragment时,询问用户是否要删除该项。我在FragmentManager内创建BaseAdapter时遇到问题。以下是getView课程中BaseAdapter部分的代码。 编辑:代码现在工作正常。我最终从Activity的构造函数中传递Adapter并使用Activity获取FragmentManager

private ArrayList<AssignmentRecord> alist = new ArrayList<AssignmentRecord>();

private final Context aContext;

public AssignmentAdapter (Context context, Activity activity){
    aContext = context;
    aActivity = activity;
}


public void addItem (AssignmentRecord item) {
    alist.add(item);
    notifyDataSetChanged();
}

public void deleteItem (AssignmentRecord item) {
    alist.remove(item);
    notifyDataSetChanged();
}
public View getView(int position, View convertView, ViewGroup parent) {


    final CheckBox statusBox = (CheckBox)convertView.findViewById(R.id.adapter_finish_checkbox);
    if (assignmentRecord.getCurrentStatus()== AssignmentRecord.Status.NOTFINISHED){
        statusBox.setChecked(false);
    } else {
        statusBox.setChecked(true);
    }

    statusBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        class removeCheckedFragment extends DialogFragment{
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the Builder class for convenient dialog construction
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setMessage("Do you want to remove this item?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                deleteItem(assignmentRecord);
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        });
                // Create the AlertDialog object and return it
                return builder.create();
            }
        }


        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                //prompt to delete record;

                assignmentRecord.setStatus(AssignmentRecord.Status.FINISHED);


                FragmentManager fragManager = aActivity.getFragmentManager();

                removeCheckedFragment newFragment = new removeCheckedFragment();
                newFragment.show(fragManager, "TEST");


                // cancel intent for alarm manager


            } else {
                // do nothing
            }

        }
    });

    return itemlayoutview;
}

我在尝试创建FragmentManager时遇到了错误。具体来说,我收到此消息

111-05 00:03:56.575    3839-3839/com.example.victor.listadapterexample E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity
        at com.example.victor.listadapterexample.AssignmentAdapter$1.onCheckedChanged(AssignmentAdapter.java:153)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:126)
        at android.widget.CompoundButton.toggle(CompoundButton.java:87)
        at android.widget.CompoundButton.performClick(CompoundButton.java:99)
        at android.view.View$PerformClick.run(View.java:17721)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

正如Eugen Pechanec所说:

  

不要使用应用程序上下文实例化适配器。

我会在这个答案中添加一些上下文,但这样更有意义。

您将Application的{​​{1}}传递给Context。问题是您尝试使用此Adapter替代Context。在大多数情况下,您可能能够毫无问题地执行此操作,因为Activity类和Activity类都继承自Application类。

但是,在您的情况下,这不起作用,因为您尝试使用属于ContextWrapper类而不是getFragmentManager()类的方法Activity

此问题有多种解决方案:

  1. ContextWrapper的{​​{1}}传递给构造函数中的Activity
  2. 请勿直接从Context创建并显示Adapter。而是在构造函数中为DialogFragment添加一个侦听器,并在每次要显示Adapter时调用该侦听器。听众将引用Adapter内的听众。
  3. 还有其他解决方案,但我相信提到的是最常见的解决方案。

    旁注:在这样的地方使用DialogFragment的{​​{1}}通常被认为是不好的做法,因为此Activity的范围是整个应用,并且所以你的Application实际上正在引用你的应用程序中的所有内容 - 例如,这可能会导致内存泄漏。 尽可能缩小范围。例如,如果您只需要Context,那么您也可以在Context方法中从Adapter获取,因为所有Context都有convertView,但是范围要窄得多。

    对于这篇长篇文章感到抱歉,我希望这会有所帮助: - )