Android 使用对话框更新表行时出现NullPointer异常

Android 使用对话框更新表行时出现NullPointer异常,android,dialog,nullpointerexception,null,onitemlongclicklistener,Android,Dialog,Nullpointerexception,Null,Onitemlongclicklistener,我在这段代码的第37行得到了null指针异常,就在它说的地方 fragment_monday.add(((TextView) editText).getText().toString()); 以下是完整的文件: package com.example.classorganizer; import java.util.List; import android.app.Dialog; import android.content.Context; import android.os.Bundl

我在这段代码的第37行得到了null指针异常,就在它说的地方

fragment_monday.add(((TextView) editText).getText().toString());
以下是完整的文件:

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) editText).getText().toString());//here is your updated(or not updated) text
    dismiss();
}
}
在这里,我发布xml文件以显示编辑文本:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
                        android:id="@+id/relativeLayout4"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_weight="1" >
<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/button_ok"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="OK" />
</RelativeLayout>
</LinearLayout>

我在其中设置OnItemLongClickListener的文件:

package com.example.classorganizer;


import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.cookbook.data.Constants;
import com.cookbook.data.MyDB;




public class Monday extends ListActivity {



private static final int MyMenu = 0;
MyDB dba;
DiaryAdapter myAdapter;

private class MyDiary{
    public MyDiary(String t, String c){
        title=t;
        content=c;

        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;       
            }
        });

}

    public String title;
    public String content;

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    dba = new MyDB(this);
    dba.open();
    setContentView(R.layout.fragment_monday);





    super.onCreate(savedInstanceState);
    myAdapter = new DiaryAdapter(this);
    this.setListAdapter(myAdapter);
}



private class DiaryAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private ArrayList<MyDiary> fragment_monday;
    public DiaryAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
        fragment_monday = new ArrayList<MyDiary>();
        getdata();


    }

    public void getdata(){
        Cursor c = dba.getdiaries();
        startManagingCursor(c);
        if(c.moveToFirst()){
            do{
                String title =
                        c.getString(c.getColumnIndex(Constants.TITLE_NAME));
                String content =
                        c.getString(c.getColumnIndex(Constants.CONTENT_NAME));

                MyDiary temp = new MyDiary(title,content);
                fragment_monday.add(temp);
            } while(c.moveToNext());
        }

    }



    @Override
    public int getCount() {return fragment_monday.size();}
    public MyDiary getItem(int i) {return fragment_monday.get(i);}
    public long getItemId(int i) {return i;}
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        final ViewHolder holder;

        View v = arg1;
        if ((v == null) || (v.getTag() == null)) {
            v = mInflater.inflate(R.layout.diaryrow,  null);
            holder = new ViewHolder();
            holder.mTitle = (TextView)v.findViewById(R.id.name);

            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }

        holder.mdiary = getItem(arg0);
        holder.mTitle.setText(holder.mdiary.title);


        v.setTag(holder);

        return v;


    }

    public class ViewHolder {
        MyDiary mdiary;
        TextView mTitle;


    }

}




/** Called when the user clicks the Edit button */
public void visitDiary(View view) {
    Intent intent = new Intent(this, Diary.class);
    startActivity(intent);
}
/** Called when the user clicks the back button */
public void visitSchedule(View view) {
    Intent intent = new Intent(this, DisplayScheduleScreen.class);
    startActivity(intent);
}


}
package com.example.classorganizer;
导入java.util.ArrayList;
导入android.app.ListActivity;
导入android.content.Context;
导入android.content.Intent;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入com.cookbook.data.Constants;
导入com.cookbook.data.MyDB;
公开课星期一延长活动时间{
私有静态final int MyMenu=0;
MyDB dba;
日记适配器;
私人课堂日记{
公共MyDiary(字符串t、字符串c){
title=t;
内容=c;
ListView list=getListView();
list.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
新建EditListItemDialog(view.getContext()).show();
返回true;
}
});
}
公共字符串标题;
公共字符串内容;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
dba=新的MyDB(本);
dba.open();
setContentView(R.layout.fragment_周一);
super.onCreate(savedInstanceState);
myAdapter=新日记适配器(此);
这个.setListAdapter(myAdapter);
}
私有类DiaryAdapter扩展了BaseAdapter{
私人停车场;
私人ArrayList fragment_周一;
公共日记适配器(上下文){
mInflater=LayoutInflater.from(上下文);
fragment_monday=new ArrayList();
getdata();
}
public void getdata(){
游标c=dba.getdiaries();
开始管理光标(c);
if(c.moveToFirst()){
做{
字符串标题=
c、 getString(c.getColumnIndex(Constants.TITLE_NAME));
字符串内容=
c、 getString(c.getColumnIndex(Constants.CONTENT_NAME));
MyDaily temp=新MyDaily(标题、内容);
添加(临时);
}而(c.moveToNext());
}
}
@凌驾
public int getCount(){return fragment_monday.size();}
公共MyDaily getItem(int i){返回片段_周一。获取(i);}
公共长getItemId(int i){return i;}
公共视图getView(int arg0、视图arg1、视图组arg2){
最终持票人;
视图v=arg1;
if((v==null)| |(v.getTag()==null)){
v=最小充气量(R.layout.diaryrow,空);
holder=新的ViewHolder();
holder.mTitle=(TextView)v.findViewById(R.id.name);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
holder.mdiary=getItem(arg0);
holder.mTitle.setText(holder.mdiary.title);
v、 setTag(支架);
返回v;
}
公共类视图持有者{
我的日记;
文本视图mTitle;
}
}
/**当用户单击编辑按钮时调用*/
公共无效访问库(视图){
意向意向=新意向(本,日记类);
星触觉(意向);
}
/**当用户单击后退按钮时调用*/
公共无效访问计划(视图){
Intent Intent=新的Intent(这是DisplayScheduleScreen.class);
星触觉(意向);
}
}
以下是xml片段的一部分:

<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>

我仍然认为
片段周一
为空,在这个片段中:

list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                new EditListItemDialog(view.getContext()).show();

            return true;       
        }
    });
list.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
新建EditListItemDialog(view.getContext()).show();
返回true;
}
});

您正在使用构造函数
EditListItemDialog(上下文上下文)
创建对话框,但在onlick中,他使用的是
fragment\u monday
。未初始化。

很可能是因为您的editText为空。在布局中可能找不到id为R.id的
EditText
。edit\u text。但这只是一个猜测。您需要发布日志,以便我们能够确定原因。嗯,如果您尝试
fragment\u monday.add((EditText)v.gettext().tostring())
查看编辑文本
将是一个
编辑文本
文本视图
?Post
编辑文本对话框.xml
布局文件。尝试将视图强制转换为编辑文本而不是文本视图<代码>片段.add(((EditText)EditText.getText().toString())这意味着我需要使用fragment_monday更新上述代码,在这里设置
OnItemLongClickListener
您需要使用构造函数创建对话框
EditListItemDialog(上下文上下文,List fragment_monday)
,而不是
EditListItemDialog(上下文)
这是我更改此代码时得到的结果:此行的多个标记-fragment\u monday无法解析为变量-列表无法解析为变量-标记“context”上的语法错误,删除此令牌-无法将上下文解析为变量-无法将字符串解析为变量variable@lisoslaw您想在对话框中显示什么?、listview中的所有项目还是仅显示其中一项?我想使用对话框仅更新一行。任何一排
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                new EditListItemDialog(view.getContext()).show();

            return true;       
        }
    });