1

ListView에 대한 사용자 지정 어댑터에 문제가 있습니다. 내 문제가 xml 파일, 데이터 또는 ListView의 인스턴스와 함께 거짓말을하는 경우 확실하지 않습니다. 어댑터를 설정할 때 NullPointerException이 표시됩니다. 어댑터 클래스 : 나는 그것을 사용사용자 지정 ListView 어댑터가 NullPointerException을 throw합니다

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. 나는 이것을 몇 시간 동안 풀려고 노력해왔다. 오류 로그 : 당신이 R.layout.inbox_layout에 콘텐츠보기를 설정 InboxActivity 활동에

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

는 (나는 당신의 질문에이 파일이 표시되지 않습니다) 당신은 ID R.id.mail_list으로 ListView를 검색합니다. 이 id이있는 ListViewmail_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 방법으로 당신이 원하는 초기화하지 마십시오 (이것이 안드로이드 세계에서 일하는 방식입니다).

  • extrasnull 인 경우를 처리합니까? (extrasnull 인 경우 kidIDnull이므로이 시나리오를 처리하지 않으면 GetMessagesConnection 클래스에서 문제가 발생할 수 있습니다.)

+0

정말 어리석은 실수는 무엇입니까? 나는 두 차례 xml 레이아웃을 디자인하기 시작했습니다. 그리고 다른 메모들도 보내 주셔서 감사합니다! 저는 주로 iOS 개발자이고 Android를 배우므로 모든 노트는 저에게 매우 귀중합니다 ... – user1368800

+1

@ user1368800 정직한 실수 였다고 걱정하지 마십시오. 'findViewById'로 검색 한'View'에'NullPointerException'을 얻었을 때, 레이아웃 파일에 문제가 없는지 항상 확인해야합니다. – Luksprog

1

당신은 당신이 ID에 대한 현재의 레이아웃을 확인하는 의미하지만, 현재의 레이아웃이 setContentView(R.layout.inbox_layout);

inbox_layout 무엇으로 설정이 list = (ListView)findViewById(R.id.mail_list); 같은 목록에 인스턴스를 얻을? XML을 보여주지 않으셨습니까? 대신 setContentView(R.layout.mail_list);으로 설정하셨습니까?

편집 : 또한 사용자 정의 어댑터에서 ViewHolder를 사용하여 findViewByID(...)을 반복 호출하지 않아도됩니다. 이 자습서를 살펴보십시오. http://xjaphx.wordpress.com/2011/06/16/viewholder-pattern-caching-view-efficiently/

+0

ViewHolder에서 좋은 팁 ... 확실히 사용합니다 ... – user1368800

관련 문제