1

simple_list_item_1 に似た XML レイアウトを使用してコンテンツを膨らませる with がありますListViewArrayAdapterアプリ メニューには、テキスト サイズを増減するための 2 つのオプションがあります。の関数をオーバーライドすることで、 のTextViews内側のテキスト サイズを変更することができました。このようなもの:ListViewgetViewArrayAdapter

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 を null にして、アダプターを常に膨張させます。その場合、高さが折り返されるため、テキスト サイズを小さくすると問題なく動作します。しかし、私は仕事の過負荷を引き起こしているので、それは望ましくありません。

リストビューやテキストビューの無効化またはレイアウトの強制を試みましたが、うまくいきませんでした。

どんな助けでも大歓迎です

編集:これは 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 は、デフォルトでは 22 dp、ラージでは 40 dp です。

編集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 に答える