Android之ScrollView

1、ScrollView和HorizontalScrollView是为控件或者布局添加滚动条

2、上述两个控件只能有一个孩子,但是它并不是传统意义上的容器

3、上述两个控件可以互相嵌套

4、滚动条的位置现在的实验结果是:可以由layout_width和layout_height设定

5、ScrollView用于设置垂直滚动条,HorizontalScrollView用于设置水平滚动条:需要注意的是,有一个属性是 scrollbars 可以设置滚动条的方向:但是ScrollView设置成horizontal是和设置成none是效果同,HorizontalScrollView设置成vertical和none的效果同。

ScrollView嵌套listView时,listView会产生只能显示一行的状况,可以用如下方法解决。

解决方法

方法1:手动设置listView高度

01.public class MainActivity extends Activity {   02.    private ListView listView;   03.    @Override   04.    protected void onCreate(Bundle savedInstanceState) {   05.        super.onCreate(savedInstanceState);   06.        setContentView(R.layout.activity_main);   07.        listView = (ListView) findViewById(R.id.listView1);   08.        String[] adapterData = new String[] { "Afghanistan", "Albania",… … "Bosnia"};   09.        listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData));   10.        setListViewHeightBasedOnChildren(listView);   11.    }   12.    public void setListViewHeightBasedOnChildren(ListView listView) {   13.        // 获取ListView对应的Adapter   14.        ListAdapter listAdapter = listView.getAdapter();   15.        if (listAdapter == null) {   16.            return;   17.        }   18.   19.        int totalHeight = 0;   20.        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   21.            // listAdapter.getCount()返回数据项的数目   22.            View listItem = listAdapter.getView(i, null, listView);   23.            // 计算子项View 的宽高   24.            listItem.measure(0, 0);    25.            // 统计所有子项的总高度   26.            totalHeight += listItem.getMeasuredHeight();    27.        }   28.   29.        ViewGroup.LayoutParams params = listView.getLayoutParams();   30.        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));   31.        // listView.getDividerHeight()获取子项间分隔符占用的高度   32.        // params.height最后得到整个ListView完整显示需要的高度   33.        listView.setLayoutParams(params);   34.    }   35.}   

方法2:使用单个ListView取代ScrollView中所有内容

就是说,把整个需要放在ScrollView中的内容,统统放在ListView中,原ListView上方的数据和下方数据,都作为现ListView的一个itemView,和原ListView中的单条数据是平级的关系。

public View getView(int position, View convertView, ViewGroup parent) {//列表第一项if(position == 0){convertView = inflater.inflate(R.layout.item_solution2_top, null);return convertView;}//列表最后一项else if(position == 21){convertView = inflater.inflate(R.layout.item_solution2_bottom, null);return convertView;}//普通列表项ViewHolder h = null;if(convertView == null || convertView.getTag() == null){convertView = inflater.inflate(R.layout.item_listview_data, null);h = new ViewHolder();h.tv = (TextView) convertView.findViewById(R.id.item_listview_data_tv);convertView.setTag(h);}else{h = (ViewHolder) convertView.getTag();}h.tv.setText("第"+ position + "条数据");return convertView;
}

方法3:使用LinearLayout取代ListView

既然ListView不能适应ScrollView,那就换一个可以适应ScrollView的控件,干嘛非要吊死在ListView这一棵树上呢?而LinearLayout是最好的选择。但如果我仍想继续使用已经定义好的Adater呢?我们只需要自定义一个类继承自LinearLayout,为其加上对BaseAdapter的适配。 
/**
* 取代ListView的LinearLayout,使之能够成功嵌套在ScrollView中
* @author terry_龙
*/
public class LinearLayoutForListView extends LinearLayout {private BaseAdapter adapter;private OnClickListener onClickListener = null;/*** 绑定布局*/public void bindLinearLayout() {int count = adapter.getCount();this.removeAllViews();for (int i = 0; i < count; i++) {View v = adapter.getView(i, null, null);v.setOnClickListener(this.onClickListener);addView(v, i);}Log.v("countTAG", "" + count);}public LinearLayoutForListView(Context context) {super(context);}

上面的代码拷贝保存为LinearLayoutForListView.class,或者直接拷贝Demo中的这个类在自己的工程里。我们只需要把原来xml布局文件中的ListView替换为这个类就行了:

<pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListViewandroid:id="@+id/act_solution_3_mylinearlayout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical" >
</pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListView>

在Activity中也把ListView改成LinearLayoutForListView,就能成功运行了。

mylinearlayout = (LinearLayoutForListView) findViewById(R.id.act_solution_3_mylinearlayout);
adapter = new AdapterForListView(this);
mylinearlayout.setAdapter(adapter);

方法四

自定义可适应ScrollView的ListView
这个方法和上面的方法是异曲同工,方法3是自定义了LinearLayout以取代ListView的功能,但如果我脾气就是倔,就是要用ListView怎么办?那就只好自定义一个类继承自ListView,通过重写其onMeasure方法,达到对ScrollView适配的效果。
下面是继承了ListView的自定义类:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
public class ListViewForScrollView extends ListView {public ListViewForScrollView(Context context) {super(context);}public ListViewForScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public ListViewForScrollView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);}@Override/*** 重写该方法,达到使ListView适应ScrollView的效果*/protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
}

三个构造方法完全不用动,只要重写onMeasure方法,需要改动的地方比起方法3少了不是一点半点…
在xml布局中和Activty中使用的ListView改成这个自定义ListView就行了。代码就省了吧…
这个方法和方法1有一个同样的毛病,就是默认显示的首项是ListView,需要手动把ScrollView滚动至最顶端。

sv = (ScrollView) findViewById(R.id.act_solution_4_sv);
sv.smoothScrollTo(0, 0);

参考链接

日积月累:ScrollView嵌套ListView只显示一行 - 郑文亮 - 博客园
四种方案解决ScrollView嵌套ListView问题 - Android开发者交流 - 安卓论坛

完成 ,效果如下

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百余位中外学者探讨神经科技挑战:伦理担忧与监管难题并存

来源&#xff1a;澎湃新闻“脑电图图纸也许会读出人的意识”、“脑机接口技术可能使个人的行为被他人操纵”、“人造大脑的发明可能取代人类的角色”……这些形形色色的言论道出了人们对于神经科学的道德和伦理担忧。澎湃新闻专访了神经伦理学领域的研究人员&#xff0c;就神经…

Android之ActionBar

本文主要包括以下内容 ActionBar的显示及隐藏&#xff0c;添加图标&#xff0c;返回主页 ActionBar添加ActionView,添加ActionProvider ActionBar实现Tab ActionBar添加下拉列表 ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外&#xff0c;Action Bar也是一个…

国内智能音箱市场逐渐崛起,那么问题来了……

来源&#xff1a;AI锐见“嗨&#xff0c;Alexa&#xff0c;放首歌。”2014年&#xff0c;搭载了亚马逊虚拟语音个人助理Alexa的Echo面世&#xff0c;让人类同机器的交互方式出现了另一种可能。苹果联合创始人Steve Wozniak就曾在2016年表示&#xff0c;智能语音交互将成为计算领…

保留小数点位数和格式

JS 中 1. double运算 c parseFloat(a) parseFloat(b)) 2. 四舍五入&#xff0c;保留两位小数 c c.toFixed(2); 3. 去掉小数点后面多余的0 c c.toFixed(2)*100/100; JAVA中 Java代码 //四舍五入&#xff0c;保留指定小数位 public static Double roundDouble(Object obj, in…

Material Design入门

本文主要包括以下内容 ToolBar的使用 RecyclerView的定义与使用 ToolBar 风格 (style) 界面 (layout) 程序 (java) 首先自定义一个theme,并将AppTheme的parent改成我们自定义的theme (style.xml) <resources><style name"BaseAppTheme" parent"…

DARPA宣布未来五年将投资20亿美元开发下一波人工智能技术

来源&#xff1a;国防科技信息网作者&#xff1a;丁宏 中国船舶工业综合技术经济研究院 美国DARPA近日宣布&#xff0c;计划在未来5年内投资20亿美元用于开发下一波人工智能技术&#xff0c;寻求情境推理能力等技术的突破&#xff0c;使其有能力识别新的场景和环境并加以适应&a…

Material Design入门(二)

本文主要包括以下内容 侧滑菜单DrawerLayout实现 CardView实现 DrawerLayout介绍 drawerLayout是Support Library包中实现了侧滑菜单效果的控件&#xff0c;可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后&#xff0c;google借鉴而出现的产物。drawerLayout分…

李飞飞重回斯坦福,Andrew Moore接手谷歌云AI

来源&#xff1a;网络大数据6 月&#xff0c;海外媒体爆出「李飞飞或将离开谷歌重返斯坦福」;两周前&#xff0c;CMU 官方发布消息称 CMU 计算机学院院长 Andrew Moore 即将离职。今日&#xff0c;谷歌云博客发布的信息最终把二者的去向都敲定&#xff1a;Andrew Moore 加入谷歌…

UVA 10173 旋转卡壳

题意&#xff1a;给出一些点&#xff0c;求最小的覆盖这些点的矩形的面积。 题解&#xff1a; 枚举下边界&#xff08;是一条边&#xff09;&#xff0c;然后暴力卡壳左右边界&#xff08;点&#xff09;&#xff0c;再暴力上边界&#xff08;点&#xff09;&#xff0c;更新答…

Python Requests 丨爬虫基础入门

据说&#xff1a;看我文章的帅帅 都有个习惯&#xff1a;先点赞、收藏再看 目录 ⚽️ 一、背景知识&#xff1a;requests &#x1f3c0; 1、pip安装requests &#x1f3c8; 2、pycharm安装requests ⚾️ 3、一行代码使用requests &#x1f3be; 4、requests常用调用&…

类脑计算:让人工智能走得更远

来源&#xff1a;中国科学报像人一样思考&#xff0c;这是人们对人工智能和机器人的期待。大踏步前进的人工智能&#xff0c;似乎走到了十字路口。“机器综合智能水平和人脑相差较大&#xff0c;机器学习需要较多人工干预&#xff0c;不同人工智能模态之间交互协同较少……”近…

Android之Fragment(一)

Fragment的产生与介绍 Android运行在各种各样的设备中&#xff0c;有小屏幕的手机&#xff0c;超大屏的平板甚至电视。针对屏幕尺寸的差距&#xff0c;很多情况下&#xff0c;都是先针对手机开发一套App&#xff0c;然后拷贝一份&#xff0c;修改布局以适应平板神马超级大屏的…

《Python快速入门》基础知识扫盲课

据说:看我文章的帅帅 都有个习惯:先点赞、收藏再看 目录 🐜 1、Python 初体验 Pycharm 第一个程序 交互式编程第一个程序

数字技术对就业的影响分析

来源&#xff1a; 腾讯研究院技术是增长之源&#xff0c;就业是民生之本。技术进步对就业具有双重影响&#xff0c;它不仅带来新的工作机会&#xff0c;改善人们的生活&#xff1b;也会替代一些原有岗位&#xff0c;带来“技术性失业”。1930年&#xff0c;英国伟大的经济学家凯…

Android之Fragment(二)

本文主要内容 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对话框 如何与ActionBar&#xff0c;MenuItem集成等 管理Fragment回退栈 类似与Android系统为Activity维护一个任务栈&#…

带你薅“云”羊毛:定个小目标,先薅他一年

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 一、2022年了&#xff0c;一块钱能干什么&#xff1f; 1块钱 能买一瓶矿泉水 1块钱 能坐一次公交 1块钱 竟然能买来一年的云服务器 哈哈哈&#xff0c;今天西红柿就带大家一块钱白嫖京东云服务器&#xff0c;当然&#xff0c;氪金也是…

ubuntu下搭建android开发环境(转载)

在ubuntu下搭建android开发环境&#xff0c;准备学习一下android开发。 1、安装JDK 首先到oracle的官网上下载linux版本的JDK&#xff08;网址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26&#xff0d;download-400750.html&#xff09;&#x…

《瓦森纳协定》——光刻机为什么就是不卖给中国!

来源&#xff1a;金属加工&#xff08;ID&#xff1a;mw1950pub&#xff09;谈起光刻机相信大家首先想到的是荷兰&#xff0c;确实如此&#xff0c;荷兰光刻机在全球都是数一数二的&#xff0c;就连最顶尖的光刻机制造公司ASML也位于荷兰&#xff0c;二荷兰光刻机之所以这么出名…

Material Design入门(三)

本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPagertabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多&#xff0c;主要有以下几个&#xff1a; CoordinatorLayout 组织它的子views之间协作的一个Layout&#xff0c;它可以给子View切换提供…

干货|2018物流机器人行业报告发布!不容错过

来源&#xff1a;楼今岁阅 摘要&#xff1a;2018年&#xff0c;我们都在谈智能家居、智能交通、智能工业、智能安防等热门物联网话题&#xff0c;并且预计到2020年&#xff0c;中国物联网的整体规模将超过1.8万亿元。发展如此迅速&#xff0c;其涉及的领域一定会越来越广&#…