android listview里面能嵌套gridview吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android listview里面能嵌套gridview吗相关的知识,希望对你有一定的参考价值。

如果能,怎么给gridview赋值,并且获得点击的gridview项的内容

listview里面能嵌套listview,gridview等等你能想到的控件,至于赋值你需要在重写的Listview的Adapter里面把数据传递进来,然后把数据赋值给gridview的adapter就好了,gridview的子项点击监听事件也写在Listview的Adapter里面,不要想得太复杂了。 参考技术A getview里面包含gridview,只是事件冲突麻烦,可以屏蔽gridviews触碰事件 参考技术B 在开发的过程中可能需要用到listview嵌套gridview的场景,但是在android中,不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动事件,导致只显示一到两行数据。那么就换一种思路,首先让子控件的内容全部显示出来,禁用了它的滚动。如果超过了父控件的范围则显示父控件的scrollbar滚动显示内容,思路是这样,一下是代码。
具体的方法是自定义GridView组件,继承自GridView。重载onMeasure方法:

Java代码

public class MyGridView extends GridView

public MyGridView(android.content.Context context,
android.util.AttributeSet attrs)

super(context, attrs);


/**
* 设置不滚动
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);





其中onMeasure函数决定了组件显示的高度与宽度;
makeMeasureSpec函数中第一个函数决定布局空间的大小,第二个参数是布局模式
MeasureSpec.AT_MOST的意思就是子控件需要多大的控件就扩展到多大的空间
同样的道理,ListView也适用

scrollview里面嵌套listview的坑

scrollview里面嵌套listview是一种很不好的做法,最好还是使用一个listview,将其他需要滑动的部分添加为头布局脚部局,或者在adapter里面将头脚用一个标志位去判断作为单独的item,这样性能是最完好的,不容易出现bug。

当然了,难免有人会用到的,会出现只显示一个item的bug,解决办法有两种。一种是自定义一个WrapContentListview,很简单的继承自Listview,只需要重写OnMeasure方法

public class WrapContentListView extends ListView{
public WrapContentListView(Context context) {
super(context);
}

public WrapContentListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public WrapContentListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
改成这样就好了。
第二种解决办法:动态设置listview,去测量每个item的高度,通过for循环去叠加计算listview的总高度
/**
* 解决ScrollView嵌套ListView只显示一条的问题
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i,null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() *
(listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
listView.invalidate();
}

注意:我在项目中遇到这两个都用不了的情况,具体原因是我的item用的是百分比布局或者是wrapcontent那种,所以叠加的时候发生异常就不会动态计算出高度了
我们所需要做的就是把item中高度设为具体的dp值,这样才可以使用以上两种方法。


 

以上是关于android listview里面能嵌套gridview吗的主要内容,如果未能解决你的问题,请参考以下文章

listview嵌套gridview,并实现grid元素部分显示以及点击展开与折叠

android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。

popwindows 嵌套Listview 在android 7.1显示问题

Android - 问题解决之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

Android中不同方向嵌套滑动的解决方式(ListView为样例)

我的Android进阶之旅------&gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法