欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

ListView根据屏幕高度自适应设置Item的高度(Android)

程序员文章站 2022-05-25 12:35:41
假设一个页面的listview要显示6个item,根据屏幕的高度不同,item的高度也不同。 思路:在xml文件里设置listview高度: android:layout_height=&quo...

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