您好我已经环顾四周,并且无法找到问题的明确答案。我有一个custom adapter
,BaseAdapter
,我与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)
任何帮助将不胜感激
答案 0 :(得分:2)
正如Eugen Pechanec所说:
不要使用应用程序上下文实例化适配器。
我会在这个答案中添加一些上下文,但这样更有意义。
您将Application
的{{1}}传递给Context
。问题是您尝试使用此Adapter
替代Context
。在大多数情况下,您可能能够毫无问题地执行此操作,因为Activity
类和Activity
类都继承自Application
类。
但是,在您的情况下,这不起作用,因为您尝试使用属于ContextWrapper
类而不是getFragmentManager()
类的方法Activity
。
此问题有多种解决方案:
ContextWrapper
的{{1}}传递给构造函数中的Activity
。Context
创建并显示Adapter
。而是在构造函数中为DialogFragment
添加一个侦听器,并在每次要显示Adapter
时调用该侦听器。听众将引用Adapter
内的听众。还有其他解决方案,但我相信提到的是最常见的解决方案。
旁注:在这样的地方使用DialogFragment
的{{1}}通常被认为是不好的做法,因为此Activity
的范围是整个应用,并且所以你的Application
实际上正在引用你的应用程序中的所有内容 - 例如,这可能会导致内存泄漏。
尽可能缩小范围。例如,如果您只需要Context
,那么您也可以在Context
方法中从Adapter
获取,因为所有Context
都有convertView
,但是范围要窄得多。
对于这篇长篇文章感到抱歉,我希望这会有所帮助: - )