2015-03-19 2 views
0

У меня есть пользовательский адаптер, который отображает сообщения в разговоре. Теперь я хочу выделить текст в текстовом виде, если сообщение не читается и в противном случае его можно развернуть. Однако, когда я просматриваю список этого адаптера, TextViews не сохраняют предыдущую настройку, они теряют полужирный текст или полужирный текст для чтения. Я пробовал много решений на SO, но до сих пор ничего не получилось.TextView внутри ListView получает изменения при прокрутке

Я поставил все переменные в класс держателя:

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

+0

вы можете использовать 'if (message.readState == 0) {// do smething. set font} else {// что-то делать. set font} 'и удалить' holder.readState = getItem (position) .readState; ' – Raghunandan

+0

@Shaz странно, это то, что я изначально сделал, но теперь он работает отлично! Возможно, вы захотите передать ответ, и я буду отмечать его как правильное. –

ответ

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() способ.

Смежные вопросы