2014-01-19 44 views
0

編碼我的Android應用程序時,我有一個NPE。我已經閱讀了至少數百個關於它的主題,但沒有找到任何答案。所以我最後直接問那裏。以下是錯誤:ANDROID適配器 - 在getView方法的NullPointerException(行:textView.setText())

01-19 21:13:09.886: E/AndroidRuntime(6622): FATAL EXCEPTION: main 
01-19 21:13:09.886: E/AndroidRuntime(6622): java.lang.NullPointerException 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at esstin.projet.ExpositionAdaptateur.getView(ExpositionAdaptateur.java:59) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.AbsListView.obtainView(AbsListView.java:2465) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1250) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.ListView.onMeasure(ListView.java:1162) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.View.measure(View.java:15504) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.View.measure(View.java:15504) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.View.measure(View.java:15504) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.View.measure(View.java:15504) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2385) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.View.measure(View.java:15504) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1979) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1222) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1395) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4526) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.Choreographer.doFrame(Choreographer.java:525) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.os.Handler.handleCallback(Handler.java:615) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.os.Looper.loop(Looper.java:137) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
01-19 21:13:09.886: E/AndroidRuntime(6622):  at dalvik.system.NativeStart.main(Native Method) 

然後,類 「ExpositionAdaptateur」,它是自定義的適配器(在誤差與線 「nomExpo.setText(listeExpo.get(位置).getNom());」:

package esstin.projet; 

import java.util.List; 

import esstin.projet.accesbase.Exposition; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class ExpositionAdaptateur extends BaseAdapter { 

    List<Exposition> listeExpo; 
    LayoutInflater inflater; 
    Context context; 

    public ExpositionAdaptateur(Context context, List<Exposition> listeExpo) { 
     //inflater = LayoutInflater.from(context); 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.listeExpo = listeExpo; 
     this.context = context; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return listeExpo.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
      LinearLayout layoutItem; 
      //(1) : Réutilisation des layouts 
      if (convertView == null) { 
      //Initialisation de notre item à partir du layout XML "personne_layout.xml" 
      layoutItem = (LinearLayout) inflater.inflate(R.layout.expositionadaptateur, parent, false); 
      } else { 
      layoutItem = (LinearLayout) convertView; 
      } 

      //(2) : Récupération des TextView de notre layout  
      TextView nomExpo = (TextView)layoutItem.findViewById(R.id.nomExpo); 

      //(3) : Renseignement des valeurs  
      nomExpo.setText(listeExpo.get(position).toString()); 

      //On retourne l'item créé. 
      return layoutItem; 
     } 

} 

這是我的ListView的每一行佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

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

</LinearLayout> 

然後主要佈局:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/listViewExpo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

最後的主類:

package esstin.projet; 

import java.util.ArrayList; 
import java.util.List; 

import esstin.projet.accesbase.Exposition; 
import esstin.projet.accesbase.ExpositionBDD; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 

public class AccueilGalerie_activity extends Activity implements View.OnClickListener { 

    private Button boutonExpo1 = null; 
    private Button boutonExpo2 = null; 
    private Button boutonExpo3 = null; 
    private TextView expo1TxtView = null; 
    List<Exposition> listeExposition = new ArrayList<Exposition>(); 
    ListView listViewExpo; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.accueilgalerie_activity); 
     int count = 0; 
     ExpositionBDD expoBdd = new ExpositionBDD(this); 
     expoBdd.open(); 

     while(count <= expoBdd.getNumberOfRows()){ 
      Exposition expoFromDb = expoBdd.getExpositionWithId(count); 
      listeExposition.add(expoFromDb); 
      count++; 
     } 

     expoBdd.close(); 
     ExpositionAdaptateur adapter = new ExpositionAdaptateur(this,listeExposition); 
     listViewExpo = (ListView)findViewById(R.id.listViewExpo); 
     listViewExpo.setAdapter(adapter); 

    } 

    @Override 
    public void onClick(View v) { 

    } 

} 

我試圖修復它,因爲一個星期,所以這將是巨大的,如果有人能找到發生了什麼事!:)

謝謝!

+0

請檢查'listeExpo.get(position).toString()'是否返回任何內容。 –

+1

你的'listExpo'包含'null'元素嗎? –

+0

'getExpositionWithId()'似乎很可疑 - 那裏有什麼? – laalto

回答

0
int count = 0; 
//... 
while(count <= expoBdd.getNumberOfRows()){ 
    Exposition expoFromDb = expoBdd.getExpositionWithId(count); 
    listeExposition.add(expoFromDb); 
    count++; 
} 

該循環運行getNumberOfRows() + 1次。現在,根據getExpositionWithId()實現,它可能導致null在列表中結束,導致NPE時toString()叫上在這裏:

nomExpo.setText(listeExpo.get(position).toString()); 

快速修復:改變<=<

+0

謝謝,但我只是嘗試和NPE保持不變! – Felix210591

+0

謝謝大家,我改變了我的count = 0,count = 1,並且我的List的開頭沒有空值!然後,它完美的作品!再次感謝你 ! – Felix210591

相關問題