1

我的自定義適配器ListView有一些問題。我不確定我的問題在於xml文件,數據還是ListView的實例化。當我設置適配器時,我得到一個NullPointerException。該適配器類:自定義ListView適配器拋出NullPointerException

public class InboxAdapter extends BaseAdapter { 

    private Context context; 

    private List<MailInbox> mails; 

    public InboxAdapter(Context context, List<MailInbox> mails) 
    { 
     this.context = context; 
     this.mails = mails; 
    } 

    @Override 
    public int getCount() { 
     return mails.size(); 
    } 

    @Override 
    public Object getItem(int item) { 
     return mails.get(item); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 

     MailInbox entry = mails.get(position); 

     if(convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.mail_list_row, null); 
     } 

     ImageView mailImg = (ImageView)convertView.findViewById(R.id.mail_thumb); 
     boolean read = entry.IsRead; 

     if(read) 
     { 
      //Set "read" image 
      mailImg.setImageResource(R.drawable.message); 
     } else 
     { 
      //Set "unread" image 
      mailImg.setImageResource(R.drawable.message); 
     } 

     TextView author = (TextView)convertView.findViewById(R.id.mail_text); 
     TextView body = (TextView)convertView.findViewById(R.id.mail_detail); 
     TextView date = (TextView)convertView.findViewById(R.id.mail_date); 

     author.setText(entry.AuthorName); 
     body.setText(entry.MessageBody); 
     date.setText(entry.CreatedAt); 

     return convertView; 
    } 
} 

Activity,我使用它:

public class InboxActivity extends SherlockActivity 
{ 
    private ListView list; 
    private GetMessagesConnection mMessages; 

    public String kidID; 

    public InboxActivity() { 
     // TODO Auto-generated constructor stub 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.inbox_layout);   

     Bundle extras = getIntent().getExtras(); 
     if(extras != null) 
     { 
      kidID = extras.getString("kidID"); 
     } 

     new GetMails().execute(); 
    } 

    private void setUpList() 
    { 
     list = (ListView)findViewById(R.id.mail_list);  

     ArrayList<MailInbox> mails = new ArrayList<MailInbox>(); 

     for(int i = 0; i < mMessages.myMail.size(); i++) 
     { 
      MailInbox inbox = new MailInbox(); 

      inbox.AuthorName = mMessages.myMail.get(i).AuthorName; 
      inbox.CreatedAt = mMessages.myMail.get(i).CreatedAt; 
      inbox.MessageBody = mMessages.myMail.get(i).MessageBody; 
      inbox.IsRead = mMessages.myMail.get(i).IsRead; 

      System.out.println("Author: " + inbox.AuthorName); 
      System.out.println("Time: " + inbox.CreatedAt); 
      System.out.println("Message: " + inbox.MessageBody); 
      System.out.println("Read: " + inbox.IsRead); 

      mails.add(inbox); 
     } 

     int length = mails.size(); 
     System.out.println("Size: " + length); 

     InboxAdapter adapter = new InboxAdapter(this, mails); 

     // It crashes here with a Nullpointer Exception 
     list.setAdapter(adapter); 
    } 

    private class GetMails extends AsyncTask<Void, Void, Void> implements DialogInterface.OnCancelListener 
    { 
     private ProgressDialog dialog; 

     protected void onPreExecute() 
     { 
       dialog = ProgressDialog.show(InboxActivity.this, "", "Henter beskeder...", true); 
     } 

     protected Void doInBackground(Void... unused) 
     { 
       mMessages = new GetMessagesConnection(); 

       mMessages.kidID = kidID; 

       mMessages.connection(); 

       return null; 
     } 

     protected void onPostExecute(Void unused) 
     {   
      dialog.dismiss(); 
      setUpList(); 
     } 

     public void onCancel(DialogInterface dialog) 
     { 
      cancel(true); 
      dialog.dismiss(); 
     } 
    } 
} 

* mail_list *:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mail_list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="2" >  
</ListView> 

* mail_list_row *:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="48dip" 
    android:background="@drawable/listselector" 
    > 
    <ImageView 
     android:id="@+id/mail_thumb" 
     android:layout_width="30dip" 
     android:layout_height="30dip" 
     android:layout_centerVertical="true" 
     android:layout_alignParentLeft="true" 
     android:contentDescription="@string/imgdesc" 
     /> 
    <TextView 
     android:id="@+id/mail_text" 
     android:layout_toRightOf="@+id/mail_thumb" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14dip" 
     android:layout_marginLeft="8dip" 
     android:layout_centerVertical="false" 
     android:singleLine="true" 
     android:ellipsize="end" 
     android:textStyle="bold" 
     android:textColor="@android:color/white" 
     /> 
    <TextView 
     android:id="@+id/mail_detail" 
     android:layout_toRightOf="@+id/mail_thumb" 
     android:layout_below="@+id/mail_text" 
     android:layout_width="100dip" 
     android:layout_height="wrap_content" 
     android:textSize="12dip" 
     android:layout_marginLeft="8dip" 
     android:layout_centerVertical="false" 
     android:singleLine="true" 
     android:ellipsize="end" 
     android:textColor="@color/grey"  
     /> 
    <TextView 
     android:id="@+id/mail_date" 
     android:layout_toRightOf="@+id/mail_detail" 
     android:layout_below="@+id/mail_text" 
     android:layout_width="100dip" 
     android:layout_height="wrap_content" 
     android:textSize="12dip" 
     android:singleLine="true" 
     android:ellipsize="end" 
     android:textColor="@color/grey" 
     android:layout_alignParentRight="true"  
     /> 
</RelativeLayout> 

我不不知道可能是什麼null。我一直試圖解決這個問題好幾個小時。 錯誤日誌:

05-14 19:55:45.525: E/AndroidRuntime(2509): FATAL EXCEPTION: main 
05-14 19:55:45.525: E/AndroidRuntime(2509): java.lang.NullPointerException 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.cim.daycare.InboxActivity.setUpList(InboxActivity.java:75) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.cim.daycare.InboxActivity.access$2(InboxActivity.java:36) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.cim.daycare.InboxActivity$GetMails.onPostExecute(InboxActivity.java:101) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.cim.daycare.InboxActivity$GetMails.onPostExecute(InboxActivity.java:1) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.os.Looper.loop(Looper.java:123) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
05-14 19:55:45.525: E/AndroidRuntime(2509):  at dalvik.system.NativeStart.main(Native Method) 
+1

你可以發佈日誌的錯誤輸出嗎? – gutiory

+0

請發佈堆棧跟蹤。 –

+0

,你必須聲明 - >郵件 – MAC

回答

2

InboxActivity您設置的內容視圖R.layout.inbox_layout活動(我沒有看到你的問題這個文件),你搜索ListView用id R.id.mail_list。 A ListViewid存在於mail_list.xml文件中。你確定爲InboxActivity內容的看法是不R.layout.mail_list

//... 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mail_list);   
     Bundle extras = getIntent().getExtras(); 
//... 

另外:

  • 請不要聲明構造爲InboxActivity,初始化你想要什麼的onCreate方法(這是在Android世界中的工作方式)。

  • 您是否處理extrasnull的情況? (如果extrasnull然後kidID也將null,這可能讓你陷入困境的GetMessagesConnection類,如果你不處理這種情況)。

+0

什麼令人難以置信的愚蠢的錯誤:)我已經開始設計XML佈局兩個不同時間.. 。謝謝你的其他筆記!我主要是iOS開發人員,我正在學習Android,因此所有這樣的筆記對我來說都是非常有價值的... – user1368800

+1

@ user1368800不要擔心這是一個誠實的錯誤。當你在'ViewView'上得到一個'NullPointerException'時,你用'findViewById'進行搜索,你應該總是看看它是不是佈局文件有問題。 – Luksprog

1

你得到的實例添加到列表這樣list = (ListView)findViewById(R.id.mail_list);這意味着你正在檢查你當前佈局爲ID,但當前的佈局設置爲setContentView(R.layout.inbox_layout);

什麼是inbox_layout?您沒有向我們展示過XML嗎?您是不是要將其設置爲setContentView(R.layout.mail_list);

編輯:此外,你可能想看看在你的自定義適配器使用ViewHolder,以避免重複調用findViewByID(...)。看看這個教程:http://xjaphx.wordpress.com/2011/06/16/viewholder-pattern-caching-view-efficiently/

+0

ViewHolder的好技巧...絕對會使用... – user1368800

相關問題