假设一个页面的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。