【问题标题】:TextView inside ListView get changed on scrollingListView 内的 TextView 在滚动时发生变化
【发布时间】:2015-03-19 04:23:22
【问题描述】:

我有一个自定义适配器,可以显示对话中的消息。现在,如果未阅读该消息,我想将 textview 加粗,否则将其取消加粗。但是,当我滚动该适配器的列表视图时,TextViews 不会保留以前的设置,它们会丢失粗体文本或加粗阅读文本。我在 SO 上尝试了很多解决方案,但是到目前为止没有任何效果。

我已将所有变量放入一个持有者类中:

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;
}

但它不起作用。有没有人可以解决这个问题?

【问题讨论】:

  • 你可以尝试不将读取状态放入持有者类吗?
  • 你可以使用if(message.readState==0) { // do smething. set font}else{//do something. set font}并删除holder.readState = getItem(position).readState;
  • @Shaz 奇怪的是,这就是我最初所做的,但现在它工作得很好!您可能想重新发布答案,我会将其标记为正确。
  • @BlameTheBrain 好的,我会将其发布为答案
  • @Raghunandan 谢谢,我一开始就这样做了,但似乎问题出在另一种方法上,所以当时我没有得到想要的结果。现在它按预期工作。

标签: android listview scroll


【解决方案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

【讨论】:

    【解决方案2】:

    您可以关注 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() 方法中创建持有者对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多