天天看點

ListView嵌套GridView出現的問題及解決方法一、準備工作二、遇到的坑

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);
           

繼續閱讀