2012-01-24 25 views
15

Tôi đang cố gắng hiển thị dữ liệu từ cơ sở dữ liệu của mình trong một ListFragment. Để làm điều này, tôi đã theo cách tương tự khi tôi sử dụng ListActivity, tạo ra bộ chuyển đổi của riêng tôi (bộ chuyển đổi có thể trông lạ, tôi chuyển nó từ một lớp học kéo dài BaseAdapter tại một trong những dự án cũ của tôi):ListView của ListFragment ném NullPointerException khi tôi sử dụng ListAdapter của riêng mình

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

    } 
} 

Tuy nhiên , dẫn đến một NullPointerException và tôi không thể tìm bất cứ điều gì từ các bản ghi trong LogCat, không có gì liên quan đến mã của tôi:

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) 

và đây là cách bố trí, trong đó có đoạn:

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

Và đây là 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> 

tôi thấy this câu hỏi, nhưng giải pháp không phải là một cái gì đó liên quan đến vấn đề của tôi, tôi nghĩ. Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

34

Bạn nên trả lại chế độ xem từ hàm getview(). Bạn đang trở về "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 
    } 

Lưu ý: Sử dụng chế độ xem tái chế và Chủ sở hữu để làm cho chế độ xem danh sách cuộn trơn tru. Để hiểu rõ hơn, hãy đọc số tutorial này.

+0

Ah, xấu của tôi, tôi đã bỏ lỡ nó vì mã là bản sao và dán từ các dự án cũ của tôi. Câu hỏi này có nên ở lại hay tôi nên xóa nó? Và cảm ơn cho tip về xem tái chế và chủ sở hữu. – Utku

+0

Có. Xóa câu hỏi này. Bài đăng này hiện không có bất kỳ mục đích nào. :) – manjusg

+7

Hãy để nó ở lại, đây là lần đầu tiên nó "measureScrapChild nullpointerexception" và cho thấy rằng đó là do một đứa trẻ bị trả về sai –

Các vấn đề liên quan