需求:实现一个可以折叠列表,折叠项下一级为一个图片列表,图片列表按等宽高格子式排列,一行N个。每个折叠项子级图片列表中的图片数目不多,在10个以内。
接触安卓开发的时间不多,供大家借鉴。
在不借用开源代码只在现有平台开发的情况下,做过4种尝试:
1.使用ListView嵌套GridView
这可能是刚进入android大家庭之后最容易想到的方法,有GridView干嘛要造轮子?之前有过这种想法,但是有印象据说AdaptView嵌套会产生滚动问题,因为android的事件流是基于焦点的,从action_down开始,如果两个嵌套且都能够实现滚动,则需要重写事件分发相关部分。
再看这个题目,子项很少,不需要滚动,第一种想法就是吧GridView高度固定:
public class NoScrollGridView extends GridView {
public NoScrollGridView(Context context) {
super(context);
}
public NoScrollGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
这种方法实现出来效果比较卡。
2.使用RecyclerView嵌套GridView
RecyclerView的bind相对于GridView的getView,调用频度较少。GridView同上。
效果提升不明显,并且第一级展开后界面会莫名其妙地跳来跳去,半天没定位明白是什么鬼。把GridView换成非AdaptView后,问题消失。
3.使用RecyclerView嵌套GridLayout
安卓4.0之后封装了格子布局,不用自己封装了。既然RecyclerView内嵌套AdapteView会出现莫名其妙的问题,就用它好了。
当控件宽高较小、二级项数较少时较为流畅,增加宽高后逐渐卡顿。
4.使用ExpandableListview嵌套单行
之前的控件选型失败。虽然bind调用频度低于getView,但在RecyclerView进行bind的时候还是实例化了过多的View导致卡顿。
当前想到唯一的可行方法就是用LinearLayout封装一个横向单行布局类,用来排列一行,然后父级采用ExpandableListView。
这种方法避免了卡顿,而且当子项项数特别多的时候同样适用,可以实现点击拉取成吨数据的需求。
第四种方法是暂时能想到的可行的方案。仅供参考。