ScrollView嵌套ListView,gridView只显示一行解决方案 (以及计算显示高度错误问题)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

     今天遇到问题如题:

             最后通过网络找到答案,,,主要是ScrollView问题,,,所以贴出来大家一起共同学习.


           解决方法1:(代码去计算高度,然后在显示)

                     private void setListViewHeightBasedOnChildren(ListView listView) {
ItemListAdapter listAdapter = (ItemListAdapter) listView.getAdapter();

if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {

View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}


    解决方法2: (复写listView )

              

publicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {
2         intmExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
3         super.onMeasure(widthMeasureSpec, mExpandSpec);
4  
5    }
    两个方法都可以,第二个相对而言比较方便点。

    问题出现了:当listView中每项中有TextView等多行显示的时候,上面的计算方法都是默认单行计算的,这样的话计算高度就不正确了。。。

    解决办法:
        这个问题不在计算函数上,因为我无法获取TextView 显示高度的一些信息,所以解决问题必须从TextView本身来考虑。。,对了,我这里就是想重写TextView控件,然后在onMeasure把显示高度计算好,这样就能成功的计算出listView的高度了。。
       重写类如下:

public class NewTextView extends TextView {


private Context context;


public NewTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.context = context;
}


public NewTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.context = context;
}


@SuppressLint("FloatMath")
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Layout layout = getLayout();
if (layout != null) {
int height = (int) FloatMath.ceil(getMaxLineHeight(this.getText()
.toString()))
+ getCompoundPaddingTop()
+ getCompoundPaddingBottom();
int width = getMeasuredWidth();
setMeasuredDimension(width, height);
}
}


@SuppressLint("NewApi")
private float getMaxLineHeight(String str) {
float height = 0.0f;
float screenW = ((Activity) context).getWindowManager()
.getDefaultDisplay().getWidth();
float paddingLeft = ((LinearLayout) this.getParent()).getPaddingLeft();
float paddingReft = ((LinearLayout) this.getParent()).getPaddingRight();
// 这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行
int line = (int) Math.ceil((this.getPaint().measureText(str) / (screenW
- paddingLeft - paddingReft))) +1 ; //+1是为了让界面更好看
height = (this.getPaint().getFontMetrics().descent - this.getPaint()
.getFontMetrics().ascent) * line;
return height;
}
}


但问题又出现了,你有可能发现程序代码报错了,关键是这一句代码:

float paddingLeft = ((LinearLayout) this.getParent()).getPaddingLeft();
float paddingReft = ((LinearLayout) this.getParent()).getPaddingRight();

可以看出,在使用控件的时候,父布局一定要是LinearLayout,所以在使用的地方把该控件用LinearLayout封装包裹一下,问题就完美解决了。。。

   如想更多交流,请加android技术群:451370308 (诚心交流,非诚勿扰)








AndroidGridView嵌套ScrollView里只有一行的解决方法 本文给大家带来两种有关AndroidGridView嵌套ScrollView里只有一行的解决方法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧 立即下载

相关推荐

ScrollView嵌套ListViewGridView,只显示一行

Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListViewGridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其

iblade的博客 541

ScrollView嵌套GridViewListView显示一行的解决办法

关于为什么只显示一行,个人理解是

luohai859的专栏 1万+

自定义webview,根据网页大小确定webview大小

public class MyWebView extends WebView { public MyWebView(Context context) { super(context); } public MyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, def

李峰峰的博客 891

如何在ScrollView嵌套ListViewScrollView、EditText、GridView

来自:http://blog.csdn.net/hitlion2008/article/details/6737459 在网上查了这方面的资料,总结来是最好不要这样嵌套使用。据说官方也是这么建议的。下面转下自己看到不错的文章。 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView。...

java开发指南博客 【转载】 79

ListView(ScrollView)嵌套ListViewGridView显示不全,内容大于一行计算高度不正确的解决办法

ListView(ScrollView)嵌套ListViewGridView显示不全,内容大于一行计算高度不正确的解决办法

smileiam的专栏 1740

Android编程笔记 GridViewListViewScrollView嵌套冲突

写项目遇到GridView和上边的一部分作为整体,

u010957508的专栏 674

ListView上面是GridViewGridView显示不全的问题

首先是看一下错误的效果,我们会看到GridView显示不全的        这个dome效果是非常的简单,首先看布局,就是ScrollView里面嵌套一个GridviewListView,当然这时候我们需要考虑的是冲突问题,不解决listviewgridview只会显示一行 ,我们需要自定义             <ScrollView android:layo

wang375048502的博客 399

ScrollView嵌套ListView显示一行

开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容。在最近的工作中,遇见一个需求,需要将ListView嵌套ScrollView显示。于是乎有了如下布局:    LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        xmln

a623891391的专栏 794

ScrollViewListViewGridView高度获取错误问题

这时一个非常常见的问题,我们只需要自定义一个TestListView继承ListView然后重写其中的onMeasure方法即可。 @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int mExpandSpec = MeasureSpec.makeMeasureSpec(Inte

就酱的博客 590

关于scrollview--listview(内部嵌套gridview等)的高度测量异常

scrollview下的listview重新测量高度可以用网上的 /** * 动态计算listview高度 * * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.get

超哥的博客 951

ScrollView嵌套GridView或者ListView

最近在做的一个项目中遇到了一个难题,就是要在ScrollView嵌套Gridview,一开始直接使用安卓自带的GridView,但是这样的话,出现了莫名其妙的错误,就是GridView高度不确定。我们知道,一般情况下使用GridView都是使用match_parent,我这里使用的是wrap_content,这样肯定是不行的,所以就考虑怎么样才能让GridView在一开始的时候就确定高度,后来

zhuzhiqiang_zhu的博客 600

ScrollViewListView冲突的问题,很多的新手会遇到的问题

ScrollView嵌套ListView时,会导致冲突,因为ListView本身都继承于ScrollView。一旦在ScrollView嵌套ListView,那么里面的ScrollView高度计算就会出现问题,废话少说直接给解决方法。(这应该是最简单的方法) 核心解决方案: 自定义listview,重写ListVie的OnMesure 方法。对GridView同样适用。 /** *

tangpengtp的专栏 831

ScrollView,ListView,GrideView,RecyclerView,ViewPager等多种view嵌套问题

开发中各种滑动布局的view如ScrollView,ListView等非常常用,但是你也会发现各种奇怪问题产生。网上的解决方法有很多种,但是杂而不全,根据个人经验现在列出常见问题以及代码最少最简单的解决方法,首先你要了解事件的分发机制及事件冲突,这里不再赘述。(其他继承自AbsListView的类也适用,包括ExpandableListViewGridView等等) ScrollVi

风离紫竹zhangqiang的博客 5978

Android ScrollViewListView,GridView共存冲突解决方案

我们在真实项目中通常会遇到ListView或者GridView嵌套ScrollView问题。但是做的时候会发现,一旦两者进行嵌套,即会发生冲突。得不到我们希望的效果。由于ListViewGridView本身都继承于ScrollView,一旦在ScrollView嵌套ScrollView,那么里面的ScrollView高度计算就会出现问题。我们也就无法得到想要的效果。下面进入正题,我们将分别

代号码农的专栏 1468

解决ScrollView嵌套Gridview显示不正常的问题

先建立一个自定义的MyGridView类。package com.dwz1676.tujiaproject.view; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; /** * 解决ScrollView嵌套Gridview显示不正常的问题 *

天涯思情的博客 274

scrollViewListView的冲突,无法计算高度

import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; /** * Created by Administrator on 2016/6/14. */ scrollViewListViewgridView的冲突,无法计算高度 public clas

huimeiad的博客 283

使用scrollview嵌套listviewgridview后出现scrollview乱滚动的问题

scrollview嵌套listviewgridviewscrollview滚动异常解决

帅气的红烧肉的博客 636

ScrollView嵌套ListView问题同样适用于gridview

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33722405的博客 102
上一篇: 百度地图API报错 Caused by: java.lang.IllegalStateException: you have not supplyed the global app context i
下一篇: android getContentLength()函数返回为-1的问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值