1

我有一个使用类似于 simple_list_item_1 的 XML 布局来扩充其内容的ListViewwith an 。ArrayAdapter我在应用程序菜单中有两个选项来增加/减小文本大小。我设法TextViews通过ListView覆盖getView. ArrayAdapter像这样的东西:

adapter = new ArrayAdapter<Line>(MyActivity.this, R.layout.line_list, lines){
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = (TextView) super.getView(position, convertView, parent);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, fontSizeDp + zoom);
        return textView;
    }
};
listView.setAdapter(adapter);

菜单选项更改缩放值并调用adapter.notifyDataSetChanged();以使适配器更改文本大小。在那之前一切正常。

问题是,当我将文本大小减小太多时,每个 TextView 的高度都不会包裹其内容。也就是说,ListView 的项太高了。当我增加文本大小时,项目高度没有问题。

如果我调用 super.getView(position, convertView, parent); 在 convertView 为空的情况下,我使适配器始终膨胀。在这种情况下,由于高度被换行,因此减小文本大小可以正常工作。但是,我导致工作超负荷,我不希望这样。

我尝试使列表视图和/或文本视图无效或强制布局,但它不起作用。

任何帮助表示赞赏

编辑:这是 line_list 布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="@dimen/lineTextSize"
android:gravity="center"
android:paddingLeft="6dip"
android:paddingRight="6dip" />

lineTextSize 默认为 22dp,大为 40dp

编辑2:看起来像这样在此处输入图像描述

而不是这个屏幕:在此处输入图像描述

4

2 回答 2

1

我在这里发现这是 Android 3.1+ 的一个已知错误

解决方案是添加这样的字符串

String ZERO_WIDTH_SPACE = "\u200b";

到 TextViews 的文本。所以,getView适配器的正确功能是:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView textView = (TextView) super.getView(position, convertView, parent);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, fontSizeDp + zoom);
    textView.setText(textView.getText() + ZERO_WIDTH_SPACE);
    return textView;
}
于 2012-10-26T23:54:54.067 回答
0

我设法测试了代码,似乎ListView不想在Honeycomb及更高版本中更新行的高度(当减小字体大小时)。解决您的问题的一个简单方法是实现getView适配器的方法,如果您的字体减少和/或回收的视图不适合当前字体大小,它将重新创建行视图。这是基于您的观察,强制使用set as的super.getView()方法是有效的,因为它将始终从头开始构建新行。我的代码正在做类似的事情,但性能要好得多:convertViewnullListView

public class CustomAdapter extends ArrayAdapter<String> {

    private LayoutInflater mInflater;
    private int mResource;

    public CustomAdapter(Context context, int resource, String[] objects) {
        super(context, resource, objects);
        mInflater = LayoutInflater.from(context);
        mResource = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(mResource, parent, false);
        } else {
            if (mZoom - mOldZoom < 0) {
                Integer cacheZoom = (Integer) convertView.getTag();
                if (cacheZoom == null || cacheZoom.intValue() != mZoom) {
                    convertView = mInflater.inflate(mResource, parent, false);
                    convertView.setTag(mZoom);
                }
            }
        }
        ((TextView) convertView).setTextSize(
                    TypedValue.COMPLEX_UNIT_DIP, 40 + mZoom);
        ((TextView) convertView).setText(getItem(position));
        return convertView;
    }

}

mZoom,mOldZoom是具有新旧缩放值的变量,用于查看字体的前进方向:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item1:
        mOldZoom = mZoom;
        mZoom += 2;
        mAdapter.notifyDataSetChanged();
        break;
    case R.id.item2:
        mOldZoom = mZoom;
        mZoom -= 2;
        mAdapter.notifyDataSetChanged();
        break;
    }
    return super.onOptionsItemSelected(item);
}
于 2012-10-05T10:39:32.663 回答