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 >> , MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
這裡的做法是設定gridview是否可以滑動。禁止滑動,就讓所有條目都顯示;可以滑動,就會出現顯示不全,但是滑動的時候可以顯示隐藏的條目。
2.gridview的點選事件沖突
在listview的根布局添加一個屬性
這個屬性有三個值可以選,有興趣自己去摸索。這裡設定的屬性意思是,如果出現事件沖突,子類響應此事件。
此外,還有gridview設定
//讓GridView的item點選事件有效
mGvInviteMember.setClickable(false);
mGvInviteMember.setPressed(false);
mGvInviteMember.setEnabled(false);
3.點選事件如何設定
這個問題想想不知道咋解決,其實卻很容易解決。
首先在listview的adapter裡設定監聽,
//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);