在我的主文件中,private class MyDiary
我设置了OnItemLongClickListener
,如下所示:
ListView list = getListView();
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
new EditListItemDialog(view.getContext()).show();
return true;
}
});
然后,在EditListItemDialog
文件中,我尝试向行表中添加新值(表格显示在上一个文件中):
@Override
public void onClick(View v) {
fragment_monday.add(((TextView) v).getText().toString());//here is your updated(or not updated) text
dismiss();
}
fragment_monday
是我的第一个使用列表视图的文件的xml:
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:padding="0dp" >
<RelativeLayout
android:id="@+id/relativeLayout4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
<ListView
android:layout_width="fill_parent"
android:gravity="center"
android:layout_height="fill_parent"
android:id="@android:id/list"
android:longClickable="true"
>
</ListView>
</RelativeLayout>
</LinearLayout>
最后,当我点击EditListItemDialog
中的确认按钮更改数据时,应用程序崩溃,我在第37行获得NullPointer Exception
,这是第二行,第3行。
我猜测fragment_monda
y设置不正确,但我真的不知道如何处理它以使这件事有效。
有人可以帮忙吗?
这是LogCat输出:
04-21 09:18:53.009: E/AndroidRuntime(5483): FATAL EXCEPTION: main
04-21 09:18:53.009: E/AndroidRuntime(5483): java.lang.NullPointerException
04-21 09:18:53.009: E/AndroidRuntime(5483): at com.example.classorganizer.EditListItemDialog.onClick(EditListItemDialog.java:37)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.view.View.performClick(View.java:2485)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.view.View$PerformClick.run(View.java:9080)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.os.Handler.handleCallback(Handler.java:587)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.os.Handler.dispatchMessage(Handler.java:92)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.os.Looper.loop(Looper.java:130)
04-21 09:18:53.009: E/AndroidRuntime(5483): at android.app.ActivityThread.main(ActivityThread.java:3687)
04-21 09:18:53.009: E/AndroidRuntime(5483): at java.lang.reflect.Method.invokeNative(Native Method)
04-21 09:18:53.009: E/AndroidRuntime(5483): at java.lang.reflect.Method.invoke(Method.java:507)
04-21 09:18:53.009: E/AndroidRuntime(5483): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-21 09:18:53.009: E/AndroidRuntime(5483): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-21 09:18:53.009: E/AndroidRuntime(5483): at dalvik.system.NativeStart.main(Native Method)
我还尝试将私有类MyDiary中的第一段代码移动到私有类MyAdapter扩展BaseAdapter但没有变化。
EditListItemDialog的完整代码:
package com.example.classorganizer;
import java.util.List;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
class EditListItemDialog extends Dialog implements View.OnClickListener {
private View editText;
public EditListItemDialog(Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_text_dialog);//here is your xml with EditText and 'Ok' and 'Cancel' buttons
View btnOk = findViewById(R.id.button_ok);
editText = findViewById(R.id.edit_text);
btnOk.setOnClickListener(this);
}
private List<String> fragment_monday;
public EditListItemDialog(Context context, List<String> fragment_monday) {
super(context);
this.fragment_monday = fragment_monday;
}
@Override
public void onClick(View v) {
fragment_monday.add(((TextView) v).getText().toString());//here is your updated(or not updated) text
dismiss();
}
}
答案 0 :(得分:0)
EditListItemDialog
中有两个构造函数,其中只有另一个构造函数初始化fragment_monday
。在您的onItemLongClick()
代码中,您使用的是不初始化该变量的1-arg构造函数。 onClick()
使用fragment_monday
,这是你的NPE。
要修复它,要么
删除1-arg构造函数并仅使用2-arg构造函数,或
将fragment_monda
初始化为1-arg构造函数中的合理默认值。
答案 1 :(得分:0)
据我所知,你有两个EditListItemDialog构造函数。一个是fragment_monday而另一个没有它。因此,如果在第一个构造函数的帮助下创建对象,则fragment_monday等于null。
只需替换
public EditListItemDialog(Context context) {
super(context);
}
有了这个
public EditListItemDialog(Context context) {
super(context);
this.fragment_monday = new List<String>();
}
我不知道是否一切都会好,但它会阻止Null Pointer Exception;