【发布时间】:2013-05-08 07:10:25
【问题描述】:
我有一个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- 我在运行时更改 TextSize 的事实每次重用 convertView 时。最好通过onNewView 执行此操作,然后convertViews 将已经使用新的设置大小。但是,尝试这样做会失败,因为大多数时候,适配器已经创建,并且视图已经存在。
2 - 事实上,由于代码在bindView 上运行,现有视图不会立即看到更改,并且在滚动过程中的某个时间点,用户将看到一些具有旧文本大小的视图,和一些新的文本大小。 Example Image attached.
话虽如此,我希望我可以完成一些类似重新初始化适配器的操作,但我不知道该怎么做,除了可能从头开始创建适配器。 我尝试调用 notifyDataSetChanged,但什么也没做
有什么想法吗?
【问题讨论】:
-
发布您的自定义光标适配器。当我尝试在自定义列表适配器中修改视图的文本大小时,我会在适配器内部进行修改。
标签: android textview simplecursoradapter text-size