2011-06-06 75 views
0

我做了一個listview,它有三個textview和一個複選框,並將其放入BaseAdapter。如果某件商品的'未讀'狀態如此,則需要做的事情是,然後將其文字視圖大膽。但是,我遇到了兩個問題。android:getView()問題 - 滾動時更改項目

  1. 首選項總是大膽不管它被讀取還是未讀。
  2. 如果我不滾動,然後通過滾動開始重新裝載項目要大膽

我研究了一下,但沒找到什麼好東西給我。如果有人有想法,你能幫我嗎?下面是getView()。


public View getView(final int position, View convertView, ViewGroup parent) { 
      View view = convertView; 
      ViewHolder viewHolder; 

      if(convertView == null){ // check if convertView exists 
       // get and inflate layout 
       view = layoutInflater.inflate(R.layout.row, null); 

       viewHolder = new ViewHolder(); 
       viewHolder.tv1 = (TextView)view.findViewById(R.id.list_callerIDname); 
       viewHolder.tv2 = (TextView)view.findViewById(R.id.list_callerIDnumber); 
       viewHolder.tv3 = (TextView)view.findViewById(R.id.list_messageSentTime); 
       viewHolder.cb = (CheckBox)view.findViewById(R.id.checkBox1); 

       // get each CheckBox into cb_array for future use 
       this.cb_array[position] = (CheckBox)view.findViewById(R.id.checkBox1); 

       // use it as a tag 
       view.setTag(viewHolder); 
      } 
      else{ 
       viewHolder = (ViewHolder)view.getTag(); 
      } 

      viewHolder.tv1.setText(this.callerIDnames[position]); 
      viewHolder.tv2.setText(this.callerIDnumbers[position]); 
      viewHolder.tv3.setText(this.messageSentTimes[position]); 

      // if message is unread, then make texts bold 
      if (messageRead_list[position] == false){ 
       viewHolder.tv1.setTypeface(viewHolder.tv1.getTypeface(), Typeface.BOLD); 
       viewHolder.tv2.setTypeface(viewHolder.tv2.getTypeface(), Typeface.BOLD); 
       viewHolder.tv3.setTypeface(viewHolder.tv3.getTypeface(), Typeface.BOLD); 
      } 

      return view; 
     } 
+0

我只是解決了這個問題。我改變的只是將'null'參數放入'setTypeface'的第一個參數中,例如'tv1.setTypeface(null,Typeface.NORMAL)'。將它設爲粗體時沒有關係,但確實使其樣式恢復正常。 我感謝您的幫助。謝謝你們!附:除非發生其他事情,否則我會將其作爲答案。 – June 2011-06-07 03:51:13

回答

0

您將不得不通過nullsetTypeFace()而不是使用getTypeFace()

getTypeFace()不返回null樣式不會被正確設置。

// if message is unread, then make texts bold 
if (messageRead_list[position] == false){ 
    viewHolder.tv1.setTypeface(null, Typeface.BOLD); 
    viewHolder.tv2.setTypeface(null, Typeface.BOLD); 
    viewHolder.tv3.setTypeface(null, Typeface.BOLD); 
} else { 
    viewHolder.tv1.setTypeface(null, Typeface.NORMAL); 
    viewHolder.tv2.setTypeface(null, Typeface.NORMAL); 
    viewHolder.tv3.setTypeface(null, Typeface.NORMAL); 
} 

或者你可以直接使用這個是當你通過null什麼做。

setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); 

setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); 
+0

嗨,rochdev。謝謝您的回答。我發現有一種方法可以使用'Typeface.defaultFromStyle()'方法而不是傳遞'null'參數。真的非常感謝你的解釋,我明白了爲什麼我需要設置'空'值。 – June 2011-06-07 20:21:20

1

當ListView重用一個視圖時,它在滾動之前可能是粗體,現在應該是平淡的。讀取消息時,請嘗試將字體顯式設置爲PLAIN。

+0

謝謝你的回覆Ted。我只是做了一個'else'命令來將字體設置爲'Typeface.NORMAL',但它不起作用。第一個最上面的項目仍然是粗體,而其他項目在滾動時變得粗體。如果你不介意,你會給我更多的建議嗎? – June 2011-06-07 00:57:29

0

你應該通過實施getItemViewType(INT位置)

像這樣使用兩種類型的觀看次數:

public int getViewTypeCount() { 
    return 2; 
} 

這:

public int getItemViewType (int position) { 
    if (messageRead_list[position] == false) return 0; 
    return 1; 
} 

,然後檢查項目類型時你創建它們來設置正確的字體。

雖然這是破解,但我設置類型爲正常或默認時,否則作爲您的評論應該是解決方案。你確定messageRead_list是正確的嗎?

+0

你好,renam。謝謝你的評論。但是,如果你不介意,你會詳細解釋我應該怎麼做嗎?(或者如果你給我一個代碼,我會非常感激),我看到你的方法之一是檢查它是否被讀取,但不明白爲什麼以及如何使用它。另外,我檢查了我的messageRead_list和其他列表是否正確。我唯一的問題是使textview加粗。再次感謝您的評論 – June 2011-06-07 03:27:52