Android - 更新列表适配器会创建Null指针异常

时间:2012-04-07 05:26:00

标签: android

我有一个ListActivity,它有一个崩溃的适配器。以下是崩溃程序的代码:

Question q = new Question ();
q.setQuestion( "" );

questions.add(q);       

adapter = new ArrayAdapter<Question>(this, R.layout.user_question_list, 
        R.id.label,  questions);

以下是我创建适配器的方法:

ArrayAdapter<Question> adapter; 

ArrayList<Question> questions = new ArrayList <Question>( );        

,列表xml是这样的:

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>    

并且整个Activity xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:orientation="vertical" >    


<TextView
    android:id="@+id/question_label"    
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Loading your questions..."
    />     

    <ListView
    android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20px" >        
    </ListView>

        <Button  
            android:id="@+id/add_question"  
            android:layout_height="wrap_content"  
            android:text="Ask a Question"
            android:onClick="sendFeedback"  
            android:layout_width="fill_parent">  
        </Button>     

</LinearLayout>

我知道为什么我尝试更新适配器的代码会导致NullPointerException?

以下是错误日志:

04-06 18:43:19.626: D/AndroidRuntime(2564): Shutting down VM
04-06 18:43:19.626: W/dalvikvm(2564): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-06 18:43:19.686: E/AndroidRuntime(2564): FATAL EXCEPTION: main
04-06 18:43:19.686: E/AndroidRuntime(2564): java.lang.NullPointerException
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.AbsListView.obtainView(AbsListView.java:2033)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.ListView.onMeasure(ListView.java:1155)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.View.measure(View.java:12723)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.View.measure(View.java:12723)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.View.measure(View.java:12723)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.View.measure(View.java:12723)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.View.measure(View.java:12723)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.os.Looper.loop(Looper.java:137)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at android.app.ActivityThread.main(ActivityThread.java:4424)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at java.lang.reflect.Method.invokeNative(Native Method)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at java.lang.reflect.Method.invoke(Method.java:511)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-06 18:43:19.686: E/AndroidRuntime(2564):     at dalvik.system.NativeStart.main(Native Method)

以下是Activity的开头如何:

public class MyQuestionsActivity extends ListActivity
{
    ArrayAdapter<Question> adapter;     

    ArrayList<Question> questions = new ArrayList <Question>( );        

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.users_questions);

        // Make sure the user is logged in
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( MyQuestionsActivity.this);
        final String user_id = prefs.getString( "user_id" , null );     

        // If the user is not logged in, send them to log in
        if ( user_id == null )
        {
            sendEmail("My Questions Error", "User id is empty but they chose the my-questions button. They should be logged in before they see this button. Here is their user_id: " + user_id );       

            Intent loginIntent = new Intent( MyQuestionsActivity.this, LoginActivity.class);
            MyQuestionsActivity.this.startActivity(loginIntent);            
        }          

        final TextView question_label = (TextView) findViewById(R.id.question_label);

        Question q = new Question ();
        q.setQuestion( "" );

        questions.add(q);       

        adapter = new ArrayAdapter<Question>(this, R.layout.user_question_list, 
                R.id.label,  questions);

        setListAdapter ( adapter );

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
        ...

以下是Question类的字段:

public String questionId;
public String question;
public ArrayList <QuestionComment>  questionComments;
public String questionByMemberId;
public String authorName;

谢谢!

2 个答案:

答案 0 :(得分:2)

试试这个,

adapter = new ArrayAdapter<Question>(this, R.layout.user_question_list, questions);

让我知道发生了什么......

答案 1 :(得分:0)

尝试将android:id =“@ android:id / list”更改为android:id =“@ android:id / mylist”如果您没有扩展ListActivity并粘贴活动代码

setListAdapter ( adapter ); 
ListView lv = getListView();
lv.setTextFilterEnabled(true);

尝试将其重新排序为bwlow ::

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setListAdapter ( adapter );