0

ListViewカスタムを使用して情報SimpleCursorAdapterを表示する があります。各行ListViewには 3 つのTextView項目があります。

アプリケーションの性質上、読者は、行項目に表示されるテキストを読みやすくするためにフォント サイズを変更したい場合と、変更したくない場合があります。

私が達成したいのは、このTextViewアイテムのテキスト サイズを から更新する必要なく更新する方法bindView()です。

これが私が現在行っている方法です:

ステップ 1: textSize を変更する必要があることをアダプターに通知します。

public void setAdjustTextSize(int size) {       
    switch (size) {
    case ArticleViewFragment.FONT_SIZE_SMALL:
        mTitleTextSizeRes = R.dimen.title_size_small;
        mCategoryTextSizeRes = R.dimen.description_size_small;
        mDescripTextSizeRes = R.dimen.description_size_small;
        break;
    case ArticleViewFragment.FONT_SIZE_MEDIUM:
        mTitleTextSizeRes = R.dimen.title_size_medium;
        mCategoryTextSizeRes = R.dimen.description_size_medium;
        mDescripTextSizeRes = R.dimen.description_size_medium;
        break;
    case ArticleViewFragment.FONT_SIZE_LARGE:
        mTitleTextSizeRes = R.dimen.title_size_large;
        mCategoryTextSizeRes = R.dimen.description_size_large;
        mDescripTextSizeRes = R.dimen.description_size_large;
        break;
    case ArticleViewFragment.FONT_SIZE_EXTRA_LARGE:
        mTitleTextSizeRes = R.dimen.title_size_extra_large;
        mCategoryTextSizeRes = R.dimen.description_size_extra_large;
        mDescripTextSizeRes = R.dimen.description_size_extra_large;
        break;
    default:
        break;
    }
}

mTitleTextSizeRes、mCategoryTextSizeRes、および mDescripTextSizeRes は、カスタム アダプターのインスタンス変数です。

ステップ 2: bindView() 中に textSize を設定します。

@Override
public void bindView(View view, Context arg1, Cursor arg2) {
    ViewHolder mHolder = (ViewHolder) view.getTag();
     //Some other initialization
    mHolder.category.setTextSize(TypedValue.COMPLEX_UNIT_PX, mResources.getDimension(mCategoryTextSizeRes));
    mHolder.title.setTextSize(TypedValue.COMPLEX_UNIT_PX, mResources.getDimension(mTitleTextSizeRes));
    mHolder.description.setTextSize(TypedValue.COMPLEX_UNIT_PX, mResources.getDimension(mDescripTextSizeRes));
}

さて、それはうまくいきますが、私が議論したい点がいくつかあります:

1- convertView が再利用されるたびに、実行時に TextSize を変更しているという事実。これを行うのが最善であり、そうすれonNewViewば convertViews はすでに新しいセットサイズを使用しています。ただし、ほとんどの場合、アダプターは既に作成されており、ビューは既に存在するため、そうしようとすると失敗します。

2 - コードが実行されているためbindView、既存のビューでは変更がすぐには表示されず、スクロール中のある時点で、ユーザーには古いテキスト サイズのビューがいくつか表示され、新しいテキスト サイズのビューがいくつか表示されるという事実サイズ。例 画像添付。

そうは言っても、アダプターを再初期化するようなことを達成できることを望んでいましたが、アダプターを最初から作成する以外に、その方法がわかりません。notifyDataSetChanged を呼び出してみましたが、何もしませんでした

何か案は?

4

3 に答える 3

0

カスタム アダプタを次のように変更してみてくださいgetView()

public View getView(int position, View convertView, ViewGroup parent)
{
    View view = super.getView(position, convertView, parent);
    TextView tv = (TextView)view;

    // NOTE: textSize is set in the custom adapter's constructor
    // int textSize

    tv.setTextSize(textSize);

    return view;
}
于 2013-05-07T22:49:34.507 に答える