我有一个ListView
使用自定义SimpleCursorAdapter
来显示信息的。每ListView
行有三个TextView
项目。
由于应用程序的性质,读者可能希望也可能不希望更改字体大小以方便阅读显示在行项目上的文本。
我想要完成的是一种更新这些TextView
项目的文本大小的方法,而不必从bindView()
.
这是我目前的做法:
第一步:通知适配器应该更改 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 是自定义适配器的实例变量。
第二步:在 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 但什么也没做
有任何想法吗?