2012-01-24 3 views
15

ListFragment에 내 데이터베이스의 데이터를 표시하려고합니다. 그러나ListFragment의 ListView에서 자체 ListAdapter를 사용할 때 NullPointerException이 throw됩니다.

package com.mysys.asistan; 

import android.app.ListFragment; 
import android.content.Context; 
import android.database.DataSetObserver; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListAdapter; 
import android.widget.TextView; 

import com.mysys.asistan.database.Company; 

public class CompanyListFragment extends ListFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setListAdapter(new CompanyListAdapter(getActivity())); 
    } 

    private class CompanyListAdapter implements ListAdapter { 

     private final Context context; 
     private DatabaseHelper dbHelper; 

     public CompanyListAdapter(Context context) { 
      this.context = context; 
      this.dbHelper = new DatabaseHelper(context); 
     } 

     public int getCount() { 
      return dbHelper.getCompanyCount(); 
     } 

     public Object getItem(int position) { 
      return dbHelper.getAllCompanies().get(position); 
     } 

     public long getItemId(int position) { 
      return (long) dbHelper.getAllCompanies().get(position).id; 
     } 

     public View getView(int position, View view, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View row = inflater.inflate(R.layout.company_list_item, parent, false); 
      Company company = (Company) getItem(position); 

      TextView nameView = (TextView) row.findViewById(R.id.CompanyListName); 
      TextView telephoneView = (TextView) row.findViewById(R.id.CompanyListTelephone); 
      TextView addressView = (TextView) row.findViewById(R.id.CompanyListAddress); 

      nameView.setText(company.name); 
      telephoneView.setText(company.telephone); 
      addressView.setText(company.address); 

      return null; 
     } 

     public int getItemViewType(int position) { 
      return IGNORE_ITEM_VIEW_TYPE; 
     } 

     public int getViewTypeCount() { 
      return 1; 
     } 

     public boolean hasStableIds() { 
      return true; 
     } 

     public boolean isEmpty() { 
      return getCount() == 0 ? true : false; 
     } 

     public void registerDataSetObserver(DataSetObserver observer) { 
      // TODO Auto-generated method stub 

     } 

     public void unregisterDataSetObserver(DataSetObserver observer) { 
      // TODO Auto-generated method stub 

     } 

     public boolean areAllItemsEnabled() { 
      return true; 
     } 

     public boolean isEnabled(int position) { 
      return true; 
     } 

    } 
} 

: 나는 ListActivity를 사용하는 경우이 작업을 수행하려면, 내가 같은 방법을 따라 한 내 자신의 어댑터 (어댑터가 내 오래된 프로젝트 중 하나에 BaseAdapter를 확장하는 클래스에서 변환, 이상하게 보일 수도 있습니다) 생성 즉 NullPointerException이 _ 내가 로그 캣의 로그에서 아무것도 알 수없는, 아무것도 내 코드 관련이 없습니다 :

01-24 20:24:06.040: E/AndroidRuntime(8731): FATAL EXCEPTION: main 
01-24 20:24:06.040: E/AndroidRuntime(8731): java.lang.NullPointerException 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.ListView.measureScrapChild(ListView.java:1181) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1264) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.ListView.onMeasure(ListView.java:1173) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4353) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4353) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4353) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1284) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:956) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:521) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4353) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:764) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:519) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4353) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2042) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.View.measure(View.java:10848) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewRoot.performTraversals(ViewRoot.java:941) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.view.ViewRoot.handleMessage(ViewRoot.java:2063) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.os.Looper.loop(Looper.java:132) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at android.app.ActivityThread.main(ActivityThread.java:4126) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at java.lang.reflect.Method.invoke(Method.java:491) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
01-24 20:24:06.040: E/AndroidRuntime(8731):  at dalvik.system.NativeStart.main(Native Method) 

그리고 이것은 조각이 들어있는 레이아웃입니다 :

<?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="horizontal" > 

    <fragment 
     android:id="@+id/fragment1" 
     android:name="com.mysys.asistan.CompanyListFragment" 
     android:layout_width="@dimen/company_listfragment_width" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 
을3210

그리고이 company_list_item.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" > 

    <TextView android:id="@+id/CompanyListName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView android:id="@+id/CompanyListAddress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView android:id="@+id/CompanyListTelephone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

나는 this 질문을 찾았지만 해결책은 내가 생각하는 내 문제와 관련이있는 것이 아닙니다. 귀하의 도움에 미리 감사드립니다.

답변

34

getview() 함수에서 뷰를 반환해야합니다. 당신은 "Null"을 반환합니다.

 public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row = inflater.inflate(R.layout.company_list_item, parent, false); 
     Company company = (Company) getItem(position); 

     TextView nameView = (TextView) row.findViewById(R.id.CompanyListName); 
     TextView telephoneView = (TextView) row.findViewById(R.id.CompanyListTelephone); 
     TextView addressView = (TextView) row.findViewById(R.id.CompanyListAddress); 

     nameView.setText(company.name); 
     telephoneView.setText(company.telephone); 
     addressView.setText(company.address); 

     return row;//changed from null 
    } 

참고 : 재활용보기와 홀더를 사용하면 목록보기를 부드럽게 만들 수 있습니다. beter 이해를 위해 이것을 읽으십시오 tutorial.

+0

아, 내 오래된 프로젝트의 코드를 복사하여 붙여 넣기 때문에 놓친 것 같습니다. 이 질문은 그대로 있거나 삭제해야합니까? 재활용 된 견해와 소지자에 대한 팁에 감사드립니다. – Utku

+0

예. 이 질문을 삭제하십시오. 이 게시물은 이제 아무런 목적도 없습니다. :) – manjusg

+7

머무르게하십시오. 첫 번째로 "measureScrapChild nullpointerexception"이며 잘못된 반환 된 아이 때문임을 보여줍니다. –

관련 문제