2016-02-12 87 views
0

當它開始運行時,前5行和從3行沒有錯誤。但是,它會給出空指針異常。我無法解決它爲什麼會發生?Android適配器getView null

代碼片斷:

public View getView(int position, View convertView, ViewGroup viewGroup) { 
    PaylasilanHolder holder; 
    final int pozisyon = position; 
    Object currentpaylasilan = getItem(position); 
    Paylasilanlar paylasilan = (Paylasilanlar) currentpaylasilan; 
    if (convertView == null) { 
     Log.i("tago", "convertview null"); 
     holder = new PaylasilanHolder(); 
     if (paylasilan.cesit.equals("text")) { 

      convertView = lala.inflate(R.layout.paylasilanyazi,null); 
      holder.tv1 = (TextView) convertView.findViewById(R.id.textView11); 
      holder.tv2 = (TextView) convertView.findViewById(R.id.textView12); 
      holder.tv3 = (TextView) convertView.findViewById(R.id.textView13); 
      holder.image1 = (ImageButton) convertView.findViewById(R.id.imageButton11); 
      Log.i("tago", "texttexttext"); 
     } else if (paylasilan.cesit.equals("teklifoto")) { 

      convertView = lala.inflate(R.layout.paylasilanresim,null); 
      holder.tv1 = (TextView) convertView.findViewById(R.id.textView11); 
      holder.tv2 = (TextView) convertView.findViewById(R.id.textView12); 
      holder.tv3 = (TextView) convertView.findViewById(R.id.textView13); 
      holder.image1 = (ImageButton) convertView.findViewById(R.id.imageButton11); 
      Log.i("tago", "tekliteklitekli"); 
     } else if (paylasilan.cesit.equals("ikilifoto")) { 
      Log.i("tago", "ikiliikiliikili"); 
     } else if (paylasilan.cesit.equals("anket")) { 

      convertView = lala.inflate(R.layout.paylasilananket, null); 
      holder.etv1 = (EditText) convertView.findViewById(R.id.editText5); 
      holder.etv2 = (EditText) convertView.findViewById(R.id.editText6); 
      holder.etv3 = (EditText) convertView.findViewById(R.id.editText7); 
      holder.etv4 = (EditText) convertView.findViewById(R.id.editText8); 
      Log.i("tago", "anketanketanket"); 
     } 

     convertView.setTag(holder); 

    } else { 
     holder = (PaylasilanHolder) convertView.getTag(); 
    } 

    if (paylasilan.cesit.equals("text")) { 
     holder.tv1.setText(paylasilanlarListesi.get(position).getGonderenid()); 
     holder.tv2.setText(paylasilanlarListesi.get(position).getYaziveyaurl()); 
    } else if (paylasilan.cesit.equals("teklifoto")) { 
     holder.tv3.setText(paylasilanlarListesi.get(position).getGonderenid()); 
     new urldenResim(holder.image1).execute(paylasilanlarListesi.get(position).getYaziveyaurl()); 
    } else if (paylasilan.cesit.equals("ikilifoto")) { 

    } else if (paylasilan.cesit.equals("anket")) { 
     holder.etv1.setText(paylasilanlarListesi.get(position).getQuestion()); 
     holder.etv2.setText(paylasilanlarListesi.get(position).getOption1()); 
     holder.etv3.setText(paylasilanlarListesi.get(position).getOption2()); 
     holder.etv4.setText(paylasilanlarListesi.get(position).getOption3()); 
    } 
    return convertView; 
} 

它給出:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference  

com.example.bahadir.myapplicationn.PaylasilanlarAdapter.getView(PaylasilanlarAdapter.java:128) 

在holder.tv3.settext()方法。

我該如何克服它?

+0

你想設置int爲String對象,只需嘗試holder.tv3.setText(「」+ paylasilanlarListesi.get(position).getGonderenid()); –

+0

Gonderenid是字符串Mahesh :) – CaveMan

+0

你可以發佈paylasilanresim和paylasilanyazi佈局 –

回答

1

由於您只使用一種視圖持有人,我認爲您也正在處理適配器中的一種視圖。所以你創建了一個類型的視圖,並與另一個類型重用。

您必須覆蓋getViewTypeCount()getItemViewType(int position)才能返回正確的值以使模型正常工作。

+0

我在類中覆蓋了這些方法(對不起,沒有提到)。實際上,對第九排形成不同的意見。 – CaveMan

+0

@CaveMan對我來說,它仍然聽起來像回收的問題。也許將此代碼添加到您的問題。 – tynn

2

你不能混用不同的觀點。因爲例如,如果你有第10條paylasilan.cesit.equals("anj=ket")之後,其他一些項目,適配器意見將已初始化R.layout.paylasilananket並確保holder.tv3.setText會給你NullPointerException

您應該所有佈局混合成一種佈局和顯示/隱藏根據項目是非常糟糕的部分或使用viewTypes像本教程:http://www.survivingwithandroid.com/2014/08/android-listview-with-multiple-row.html

+0

先「文」行再來三個「teklifoto」排來那麼三個「文」排就來了崩潰! – CaveMan

+0

我的意思是說很容易崩潰。 ConvertView是一種緩存,當convertView創建時,當前項目可能與該項目不同。 –

1

你不能這樣做,因爲你現在正在做。當您嘗試重新使用不同類型的單元格時出現崩潰,並且您試圖獲取對不存在文本字段的引用。

您必須將另一個字段添加到「PaylasilanHolder」,並將其設置爲膨脹新單元格時的單元格類型。

當您重複使用單元格時,例如:當「convertView!= null」時,您還必須通過引用您在「PaylasilanHolder」中定義的新字段來檢查單元格類型是否相同。否則,再次給該單元充氣。

相關問題