ListView嵌套GridView会出现很多问题,下面一一列举出现的问题,以及解决的方法。
一、准备工作
首先说一下commonAdapter。github上有很多封装好的,好用又通用adapter,这里就不详细介绍了。
二、遇到的坑
1.gridview条目显示不全
既然显示不全,就自定义一个gridview,让所有的条目都显示出来。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (haveScrollbar == false) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
这里的做法是设置gridview是否可以滑动。禁止滑动,就让所有条目都显示;可以滑动,就会出现显示不全,但是滑动的时候可以显示隐藏的条目。
2.gridview的点击事件冲突
在listview的根布局添加一个属性
android:descendantFocusability="blocksDescendants"
这个属性有三个值可以选,有兴趣自己去摸索。这里设置的属性意思是,如果出现事件冲突,子类响应此事件。
此外,还有gridview设置
//让GridView的item点击事件有效
mGvInviteMember.setClickable(false);
mGvInviteMember.setPressed(false);
mGvInviteMember.setEnabled(false);
3.点击事件如何设置
这个问题想想不知道咋解决,其实却很容易解决。
首先在listview的adapter里设置监听,
mGridViewAdapter.setItemClickListener((Activity) mContext);
//GridView的适配器
public class StudentStatusAdapter extends CommonAdapter<UserInfo> {
public StudentStatusAdapter(Context context, int layoutId) {
super(context, layoutId);
mContext = context;
}
@Override
public void convert(ViewHolder vh, UserInfo item) {
vh.setItemOnClickListener(R.id.rl_grid_view, item, this);
}
}
然后在Activity里实现点击方法就ok了,同时能选择要传递的数据。
4.listview滑动的时候卡顿
这个时候需要优化了,如果使用了commonAdapter,viewholder封装在里面,复用什么的就不说。但是仍然卡顿,主要是gridview的adapter每次都创建一个新的,复用就好了。
mGvInviteMember.setHaveScrollbar(false);//禁止滑动
if (mGridViewAdapter==null) {
mGridViewAdapter = new StudentStatusAdapter(mContext,
R.layout.item_grid_view);
}
mGridViewAdapter.setItemsData(lists);
mGvInviteMember.setAdapter(mGridViewAdapter);
注意:这里没有使用notifyDataSetChanged方法。因为这里只是复用创建的adapter,但是其数据源有变化。不懂的自行百度去。
5.GridView的columnNum问题
这个问题跟标题木有关系,只是自己遇到的坑。
-通过 GridView的getnumcolumn方法不能得到正确的值。具体原因自己去看源码。
-解决方法:设置strings.xml,通过系统的方法获取strings值
this.getString(R.string.numColumns);
mContext.getResources().getString(R.string.numColumns);