【问题标题】:ConvertView items partially updatedConvertView 项目部分更新
【发布时间】:2014-06-27 08:57:56
【问题描述】:

我的活动中有自定义 ListView,它使用 ConvertView 模式和 ViewHolder。 一切正常,但有时项目中的文本会被截断。 这在屏幕截图中清晰可见:

看起来它重用了旧视图并且不更新文本长度。 这是适配器代码的一部分:

if (convertView == null) {
     viewHolder = new ViewHolderItemBool();

     LayoutInflater inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
     if (changeable) {
         convertView = inflater.inflate(R.layout.sensor_bool_e, null, true);
     } else {
         convertView = inflater.inflate(R.layout.sensor_bool, null, true);
     }

     viewHolder.txtName = (TextView) convertView.findViewById(R.id.txtName);
     viewHolder.txtDesc = (TextView) convertView.findViewById(R.id.txtDescript);
     viewHolder.imgState = (ImageView) convertView.findViewById(R.id.img);
     convertView.setTag(viewHolder);
} else {
     viewHolder = (ViewHolderItemBool) convertView.getTag();
}
viewHolder.txtName.setText(name);
if (isImportant()) viewHolder.txtName.setTypeface(null, Typeface.BOLD);
//some code to change description field and picture
return convertView;

这是项目布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sensor_bool"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:background="@drawable/sensor_background"
    android:longClickable="true">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/circle_green"
        android:padding="10dp"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/txtName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="@dimen/sensor_text_size"
            android:singleLine="true"
            android:textColor="@color/sensor_name_color"/>

        <TextView
            android:id="@+id/txtDescript"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingStart="2dp"
            android:textSize="@dimen/sensor_desc_size"
            android:textColor="@android:color/secondary_text_light"/>
    </LinearLayout>
</LinearLayout>

如果我不使用 ConverView 并在每次看起来都很好的时候膨胀布局。 有任何解决方法的想法吗?

【问题讨论】:

  • 您的声明是否可以更改为静态?
  • 试试convertView = inflater.inflate(R.layout.sensor_bool_e, parent, false);而不是convertView = inflater.inflate(R.layout.sensor_bool_e, null, true);
  • @RanjitPati 不,但即使我删除这部分代码并仅使用一种布局,问题仍然存在
  • @shayanpourvatan 它崩溃并出现异常 UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView
  • 我已将 txtName 中的 android:layout_width="fill_parent" 更改为 android:layout_width="wrap_content",现在文本显示正常。但普通/粗体文本仍会不时更改。

标签: android listview convertview


【解决方案1】:

你需要重写 BaseAdapter 的一些方法来显示不同的列表视图项:

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    if (changeable) {
        return 0;
    } else {
        return 1;
    }
}

【讨论】:

  • 我刚试过这个,android:layout_width="wrap_content" 就够了。但是为什么普通/粗体文本没有更新?
  • 我已经覆盖了它们,否则它根本不起作用。实际上我有 5 种视图类型,我在这里只发布部分代码,因为它很长。
【解决方案2】:

我成功了!这只是一些愚蠢的错误。

首先: 我变了

android:layout_width="fill_parent"

在 txtName 到

android:layout_width="wrap_content"

这解决了文本宽度的问题。我不明白为什么它以前不起作用?

第二个:

if (isImportant()) viewHolder.txtName.setTypeface(null, Typeface.BOLD);

if (isImportant()) {
    viewHolder.txtName.setTypeface(null, Typeface.BOLD);
} else {
    viewHolder.txtName.setTypeface(null, Typeface.NORMAL);
}

这解决了粗体文本的问题。 (问题没有在问题中描述,而是在屏幕上看到。)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2017-12-05
    • 2011-06-23
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多