首先铺设一下引用场景,用户要求,“音乐”&&“有声小说”类别的声音,如果这一行中存在声音名称(也就是包含在圈起来的区域)大于8个,就显示两行的空间,否则显示一行;并且每行一定要显示8个。
旧思路
刚开始的时候,将“音乐”&&“有声小说”设计成了一种Cell,也就是在getViewType中对应同一种样式。在“音乐”类别中根据文本长度动态设置底部空间大小,这种方法不大好使,反复滑动后,还有折叠的可能性。关于换行更是奇葩,对字符串进行强制换行(到8个字,添加一个换行符)。结果是,存在部分手机一行不能显示8个的情况,就造成了超过8个字符时,仅仅显示8个的奇葩现象。
新思路
将“音乐”&&“有声小说”设计成两种Cell,这样就不会出现折叠的现象;
根据可用空间尺寸,动态计算能填充的8个字符的最大字号。计算方法如下:
1.获取声音名称所在的TextView站有的空间,eg.316px;每行最多8个汉字
2.计算可用的最大字号
int spSize = px2sp(this, 316) / 8;
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
这样就ok了!