2012-01-24 10 views
15

Estoy tratando de mostrar datos de mi base de datos en un ListFragment. Para ello, he seguido la misma manera cuando uso ListActivity, creado mi propio adaptador (adaptador puede tener un aspecto extraño, me convertí de una clase que se extiende BaseAdapter en uno de mis proyectos de edad):ListView de ListFragment arroja NullPointerException cuando uso mi propio ListAdapter

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

    } 
} 

Sin embargo , que conduce a una NullPointerException y yo no podía entender nada de los troncos en LogCat, nada relacionado con mi código:

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) 

y esta es la disposición que contiene el fragmento:

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

Y esto es 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> 

encontré this pregunta, pero la solución no es algo relacionado con mi problema que pienso. Gracias de antemano por tu ayuda.

Respuesta

34

Debería devolver la vista desde la función getview(). Usted está regresando "Nulo".

 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 
    } 

Nota: Utilice la vista reciclada y los titulares para que la vista de lista se deslice suavemente. Para mayor comprensión, lea esto tutorial.

+0

Ah, mi mal, lo he echado de menos ya que el código es una copia y pega de mis proyectos anteriores. ¿Debería permanecer esta pregunta o debería eliminarla? Y gracias por el consejo sobre la vista reciclada y los titulares. – Utku

+0

Sí. Eliminar esta pregunta Esta publicación no tiene ningún propósito ahora. :) – manjusg

+7

Por favor, déjalo, es el primero "measureScrapChild nullpointerexception" y muestra que es debido a un niño devuelto incorrectamente –

Cuestiones relacionadas