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

标签: ListView Android 自适应 高度
8人阅读 评论(0) 收藏 举报
分类:

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


查看评论

ListView中根据手机屏幕高度动态设置只显示一屏幕的item个数

方法:
  • linux_Mary_me
  • linux_Mary_me
  • 2013-12-14 13:50:52
  • 2595

android根据屏幕高度改变item占ListView高度

android根据屏幕高度改变item占ListView高度首先要知道LayoutParams是什么。利用LayoutParams可以更改每个item在listview中的样子。 // 调整每个Ite...
  • u012575339
  • u012575339
  • 2016-11-18 14:05:09
  • 188

android 根据Item数设定ListView高度

//此方法在setAdapter之前调用 public static void setListViewHeightBasedOnChildren(ListView listView) {   ...
  • qq373036876
  • qq373036876
  • 2016-06-06 19:05:31
  • 476

listview 高度自适应(根据listview的条数 确定高度 )

今天开发遇到一个问题,就是当动态插入ListView数据的时候,由于之前ListView的高度已经固定死了,所以显示不完整的数据,并且底部显示黑边。如图: 而我希望这个Lis...
  • amor5216
  • amor5216
  • 2016-05-31 17:53:36
  • 5947

根据Item数动态设定ListView高度

//此方法在setAdapter之后调用 public static void setListViewHeightBasedOnChildren(ListView listView) {     Li...
  • u011361576
  • u011361576
  • 2015-10-10 18:20:07
  • 1062

ListView不能自适应高度全屏的解决方法(可能是最完美的解决方案)

问题场景:在使用ListView高度为match_parent时,若首次加载的数据为两行,那么在下次重新加载数据为100时,ListView高度不会自适应高度,铺满全屏,还是会仅显示两行。 相反的,...
  • mvpstevenlin
  • mvpstevenlin
  • 2016-04-19 14:17:37
  • 5904

Android ScrollView中嵌套ListView,ListView根据内容自动调整高度

看到标题,很多人会奇怪这是一种什么设计,ListView 不是就可以滑动了嘛,为什么还要 ScrollView 呢,需求总是千 奇百怪的,看看下面这张图:       这两张图是一个界面,两个 Li...
  • liuwan1992
  • liuwan1992
  • 2016-09-26 23:12:28
  • 5174

Android ListView根据项数的大小自动改变高度

第一种:按照listview的项数确定高度     ListAdapter listAdapter = listView.getAdapter();       if (listAdapter ==...
  • chenxiruanhai
  • chenxiruanhai
  • 2014-04-01 15:09:48
  • 2771

布局相关 ListView的Item内部子控件高度发生改变时Item高度不能自适应怎么办

这是个ListView的布局          android:id="@+id/files"         android:layout_width="wrap_content"    ...
  • runzhi5172
  • runzhi5172
  • 2017-01-08 17:50:24
  • 529

根据itemView的大小计算ListView动态大小

1.问题产生   在PopupWindow中放置一个ListView,点击Button后希望让PopupWindow显示在Button正上方。实现ListPopWindow继承PopupWindow,...
  • BrilliantEagle
  • BrilliantEagle
  • 2015-10-27 21:54:49
  • 2087
    个人资料
    等级:
    访问量: 4万+
    积分: 624
    排名: 8万+
    最新评论