ListView根據螢幕高度自適應設定Item的高度(Android)
阿新 • • 發佈:2018-11-12
假設一個頁面的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();
//螢幕高度減去其它控制元件高度155,除以6就是每個Item的高度
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。