2015-03-19 23 views
0

我有一個自定義的適配器,用於顯示對話中的消息。現在,如果不讀取消息並將其展開,我想要粗體顯示textview。但是,當我滾動該適配器的列表視圖時,TextView不保留以前的設置,它們會丟失粗體文本或粗體顯示讀取文本。我已經嘗試了很多關於SO的解決方案,但迄今爲止還沒有任何工作。ListView中的TextView在滾動時發生變化

我已經把所有的變量爲一個holder類:

private class Holder { 
    public TextView messageTo, messageContent, date; 
    public ImageView imgView; 
    public Typeface face, bold; 
    public int boldText, normalText; 
    public int readState; 
} 

和getView我的位置得到的消息項目和檢索READSTATE從那裏(一些多餘的部分省略)

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View convertView1 = convertView; 
    LayoutInflater vi = (LayoutInflater) ctx 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    Message message = getItem(position); 
    if (convertView1 == null) { 
     holder = new Holder(); 
     convertView1 = vi.inflate(R.layout.list_view_main, parent, 
       false); 
     holder.messageTo = (TextView) convertView1 
       .findViewById(R.id.address); 
     holder.messageContent = (TextView) convertView1 
       .findViewById(R.id.previewMsg); 
     holder.date = (TextView) convertView1.findViewById(R.id.showDate); 
     holder.imgView = (ImageView) convertView1 
       .findViewById(R.id.quickBadge); 
     holder.face = Typeface.createFromAsset(ctx.getAssets(), 
       "fonts/helveticaneuelight.ttf"); 
     holder.bold = Typeface.createFromAsset(ctx.getAssets(), 
       "fonts/helveticaneue.ttf"); 
     holder.boldText = Typeface.BOLD; 
     holder.normalText = Typeface.NORMAL; 
     holder.readState = getItem(position).readState; 
     convertView1.setTag(holder); 
    } else { 
     holder = (Holder) convertView1.getTag(); 
    } 

    if(holder.readState==0) { 
     holder.messageTo.setText(message.messageNumber); 
     holder.messageContent.setText(message.messageContent); 
     holder.date.setText(message.messageDate); 
     holder.messageTo.setTypeface(holder.bold, holder.boldText); 
     holder.messageContent.setTypeface(holder.face, holder.boldText); 
     holder.date.setTypeface(holder.face, holder.boldText); 
    } else { 
     holder.messageTo.setText(message.messageNumber); 
     holder.messageContent.setText(message.messageContent); 
     holder.date.setText(message.messageDate); 
     holder.messageTo.setTypeface(holder.bold, holder.normalText); 
     holder.messageContent.setTypeface(holder.face, holder.normalText); 
     holder.date.setTypeface(holder.face, holder.normalText); 
    } 
    return convertView1; 
} 

但它不起作用。任何人都有這個解決方案?

+1

你可以嘗試不把讀取狀態放入持有者類嗎? – Shaz 2015-03-19 04:28:06

+0

你可以使用'if(message.readState == 0){//做點什麼。設置字體}其他{/ /做一些事情。設置字體}'並刪除'holder.readState = getItem(position).readState;' – Raghunandan 2015-03-19 04:34:02

+0

@Shaz奇怪的是,這就是我最初做的,但現在它完美的工作!您可能想重新發布答案,並將其標記爲正確。 – 2015-03-19 04:38:18

回答

1

試一下這個

if(message.readState==0) { 
    // keep your other part of the code as it is 
    // set font 
} else { 
    // keep your other code as it is 
    // set font 
} 

可以擺脫

holder.readState = getItem(position).readState; 

要了解它是如何工作

How ListView's recycling mechanism works

1

你可以按照Raghunandan的答案,但下面的回答可以幫助你:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View convertView1 = convertView; 
    LayoutInflater vi = (LayoutInflater) ctx 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    Message message = getItem(position); 
    final Holder holder; 
    if (convertView1 == null) { 
     holder = new Holder(); 
     convertView1 = vi.inflate(R.layout.list_view_main, parent, 
       false); 
     holder.messageTo = (TextView) convertView1 
       .findViewById(R.id.address); 
     holder.messageContent = (TextView) convertView1 
       .findViewById(R.id.previewMsg); 
     holder.date = (TextView) convertView1.findViewById(R.id.showDate); 
     holder.imgView = (ImageView) convertView1 
       .findViewById(R.id.quickBadge); 
     holder.face = Typeface.createFromAsset(ctx.getAssets(), 
       "fonts/helveticaneuelight.ttf"); 
     holder.bold = Typeface.createFromAsset(ctx.getAssets(), 
       "fonts/helveticaneue.ttf"); 
     holder.boldText = Typeface.BOLD; 
     holder.normalText = Typeface.NORMAL; 
     holder.readState = getItem(position).readState; 
     convertView1.setTag(holder); 
    } else { 
     holder = (Holder) convertView1.getTag(); 
    } 

    if(holder.readState==0) { 
     holder.messageTo.setText(message.messageNumber); 
     holder.messageContent.setText(message.messageContent); 
     holder.date.setText(message.messageDate); 
     holder.messageTo.setTypeface(holder.bold, holder.boldText); 
     holder.messageContent.setTypeface(holder.face, holder.boldText); 
     holder.date.setTypeface(holder.face, holder.boldText); 
    } else { 
     holder.messageTo.setText(message.messageNumber); 
     holder.messageContent.setText(message.messageContent); 
     holder.date.setText(message.messageDate); 
     holder.messageTo.setTypeface(holder.bold, holder.normalText); 
     holder.messageContent.setTypeface(holder.face, holder.normalText); 
     holder.date.setTypeface(holder.face, holder.normalText); 
    } 
    return convertView1; 
} 

只是在getview()方法中創建持有者對象。

相關問題