2017-10-20 63 views
-2

我得到一個片段與另一個片段中的列表視圖,和列表視圖有viewholder類是這樣的:
private class ViewHolder{ TextView rowText1; TextView rowText2; }爲什麼在ListView中的Viewholder不能處理兩個文字瀏覽?

,並給TextView的非常簡單的任務:

holder.rowText1.setText(someString); holder.rowText2.setText(someString);

日誌給我一個空指針錯誤:

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

但是,如果我只給一個視圖settext(任何一個),一切窩rks fine:

holder.rowText1.setText(someString); 
//holder.rowText2.setText(someString); 

任何想法爲什麼?

我viewholder代碼:

public View getView(int position, View convertView, ViewGroup parent) { 
     int type = getItemViewType(position); 
     ViewHolder holder; 
     if(convertView == null){ 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.some_layout, parent,false);       
      switch(type){ 
       case 1: 
        holder.rowText1 = (TextView) convertView.findViewById(R.id.textView1);            
        break; 
       case 2: 
        holder.rowText1 = (TextView) convertView.findViewById(R.id.textView1); 
        holder.rowText2 =(TextView)convertView.findViewById(R.id.textView2); 

        ImageView fileImage = (ImageView)convertView.findViewById(R.id.typeImage); 
        fileImage.setImageDrawable(fileDrawable); 
        break; 
      } 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

而且,我挖一點點,發現問題似乎是在視圖再循環級,不知何故,當系統開始回收的觀點,有兩個觀點,它只是沒有工作。

+0

問題是什麼?看起來你在發佈之前沒有完成這個問題。 – laalto

+0

對不起,這是我的第一篇文章,我試圖讓格式正確,現在問題已經完成。 – coldspring

+1

所以你忘記了初始化'rowText2'或者它是初始化null。將代碼發佈到設置視圖持有者的位置。 – laalto

回答

1

如何將getView更改爲此?

public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.some_layout, parent,false) 
     int type = getItemViewType(position); 
     ViewHolder holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.some_layout, parent,false);       
      switch(type){ 
       case 1: 
        holder.rowText1 = (TextView) convertView.findViewById(R.id.textView1);            
        break; 
       case 2: 
        holder.rowText1 = (TextView) convertView.findViewById(R.id.textView1); 
        holder.rowText2 =(TextView)convertView.findViewById(R.id.textView2);      
        ImageView fileImage = (ImageView)convertView.findViewById(R.id.typeImage); 
        fileImage.setImageDrawable(fileDrawable); 
        break; 
     } 
     convertView.setTag(holder); 
    } 
    return convertView; 
} 

這隻做一次,如果convertView不爲空,它將返回已經存在的視圖。

有關適配器的詳細信息,查看此:How does the getView() method work when creating your own custom adapter?

+0

你能解釋一下邏輯嗎?是不是我們應該避免每次都調用inflate? – coldspring

+0

你不是每次都膨脹它,但只有當convertView爲空時。 Howevery可以嘗試把我在if之外的東西(除了退貨之外)放在裏面。檢查更新回答 – Ellisan

+0

感謝您的時間,問題解決了,我沒有正確啓動,我將解決方案作爲答案 – coldspring

0

好了,我解決這個問題,你可以在我的原代碼getview看,它沒有包括的setText code.I把它之後,所以調整這樣的代碼(只需添加的setText代碼):

switch(type){ 
       case 1: 
       holder.rowText1 = (TextView)convertView.findViewById(R.id.textView1); 
       holder.rowText1.setText(someString);                            
        break; 
       case 2: 
        holder.rowText1 = (TextView) convertView.findViewById(R.id.textView1); 
        holder.rowText2 =(TextView)convertView.findViewById(R.id.textView2);      
        holder.rowText1.setText(someString); 
        holder.rowText2.setText(someString); 
        ImageView fileImage = (ImageView)convertView.findViewById(R.id.typeImage); 
       fileImage.setImageDrawable(fileDrawable); 
        break; 
      } 

正如你所看到的,因爲我只希望有一個TextView的情況1,當我把的setText碼開關條款外,即使在案例1中,它仍然想執行settext到rowtext2.it是一個非常愚蠢的錯誤,新手發現!

+0

很高興看到你解決了它! – Ellisan

相關問題