天天看點

ListView根據螢幕高度自适應設定Item的高度(Android)

假設一個頁面的ListView要顯示6個Item,根據螢幕的高度不同,Item的高度也不同。

思路:在xml檔案裡設定ListView高度:

android:layout_height="match_parent"      

在程式裡的擴充卡中的getView函數中擷取螢幕的高度,并給每個Item賦高度:

@Override
    public View getView(int position, View view, ViewGroup viewGroup)
    {
        ViewHolder viewHolder = null;
        if (view == null)
        {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.item_tuner_preset, viewGroup,
                    false);
            //擷取螢幕高度
            DisplayMetrics dm = new DisplayMetrics();
            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            wm.getDefaultDisplay().getMetrics(dm);
            mScreenHeight = dm.heightPixels;//螢幕高度      
//設定Item高度
            ViewGroup.LayoutParams linearParams = viewHolder.rlTunerList.getLayoutParams();      
linearParams.height = (mScreenHeight-155)/6;//Item高度      

viewHolder. rlTunerList.setLayoutParams(linearParams) ; view.setTag(viewHolder) ; } else { viewHolder = (ViewHolder) view.getTag() ; }    //其它View操作 return view ; }

這樣就就可以根據不同螢幕大小設定ListView中Item自适應高度,關鍵是要在程式裡擷取螢幕高度和知道其它控件高度(最好設為定值)。

有一種方法可以動态擷取控件高度,在ListView繪制的時候擷取ListView的高度,然後把高度傳入擴充卡,設定每個Item的高度。(有bug,就是多次銷毀和打開界面會使ListView忽大忽小)

在Activity給ListView綁定addOnPreDrawListener繪制的監聽器,傳入擴充卡高度:

final ViewTreeObserver viewTreeObserver = lvTunerList.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
    @Override
    public boolean onPreDraw()
    {
        lvTunerList.getViewTreeObserver().removeOnPreDrawListener(this);
        tunerPreSetAdapter.setListHeight(rl_main.getHeight()/6);
        return true;
    }
});      

在擴充卡中tunerPreSetAdapter:

public void setListHeight(int listHeight)
{
    this.listHeight = listHeight;
    needChangeHeight = true;
    //設定Item高度
}      
@Override
    public View getView(int position, View view, ViewGroup viewGroup)
    {
        ViewHolder viewHolder = null;
        if (view == null||needChangeHeight)
        {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.item_tuner_preset, viewGroup,
                    false);
            viewHolder.rlTunerList = (RelativeLayout) view.findViewById(R.id.rl_tuner_list);
            //設定Item高度
            ViewGroup.LayoutParams linearParams = viewHolder.rlTunerList.getLayoutParams();
            linearParams.height = listHeight;
            viewHolder.rlTunerList.setLayoutParams(linearParams);
      
if(position == MAX_SIZE - 1)
{
    needChangeHeight = false;
}      

view.setTag(viewHolder) ; } else { viewHolder = (ViewHolder) view.getTag() ; } return view ; }

其實這種動态設定高度的應該還有更好的處理方法,隻是沒想好如何在擴充卡中進行處理。

理論上是當ListView重新繪制時,向擴充卡傳入高度參數,然後重新繪制ListView。