怎样实现android页面滚动
答案:2 悬赏:0 手机版
解决时间 2021-03-02 01:57
- 提问者网友:niaiwoma
- 2021-03-01 17:34
怎样实现android页面滚动
最佳答案
- 五星知识达人网友:独钓一江月
- 2021-03-01 18:52
除了嵌套滚动属性的控件外,比如ListView,WebView,EditText等外,想要让某个页面滚动,需要在布局中添加ScrollView控件
一个ScrollView控件只允许声明一个子控件
通常在一个ScrollView控件中嵌套LinearLayout
如果当前布局没有嵌套ScrollView,建议更改一下布局,实现滚动效果
一个ScrollView控件只允许声明一个子控件
通常在一个ScrollView控件中嵌套LinearLayout
如果当前布局没有嵌套ScrollView,建议更改一下布局,实现滚动效果
全部回答
- 1楼网友:怙棘
- 2021-03-01 19:19
以下是我自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能 最近项目中需要用到listview下拉刷新的功能,一开始想图省事,在网上直接找一个现成的,可是尝试了网上多个版本的下拉刷新之后发现效果都不 怎么理想。有些是因为功能不完整或有bug,有些是因为使用起来太复杂,十全十美的还真没找到。因此我也是放弃了在网上找现成代码的想法,自己花功夫编写 了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能。 首先讲一下实现原理。这里我们将采取的方案是使用组合view的方式,先自定义一个布局继承自linearlayout,然后在这个布局中加入下拉 头和listview这两个子元素,并让这两个子元素纵向排列。初始化的时候,让下拉头向上偏移出屏幕,这样我们看到的就只有listview了。然后对 listview的touch事件进行监听,如果当前listview已经滚动到顶部并且手指还在向下拉的话,那就将下拉头显示出来,松手后进行刷新操 作,并将下拉头隐藏。原理示意图如下: 那我们现在就来动手实现一下,新建一个项目起名叫pulltorefreshtest,先在项目中定义一个下拉头的布局文件pull_to_refresh/apk/res/android" xmlns:tools="schemas/tools" android:id="@+id/pull_to_refresh_head" android:layout_width="fill_parent" android:layout_height="60dip" > <linearlayout android:layout_width="200dip" android:layout_height="60dip" android:layout_centerinparent="true" android:orientation="horizontal" > <relativelayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="3" > <imageview android:id="@+id/arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:src="@drawable/arrow" /> <progressbar android:id="@+id/progress_bar" android:layout_width="30dip" android:layout_height="30dip" android:layout_centerinparent="true" android:visibility="gone" /> </relativelayout> <linearlayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="12" android:orientation="vertical" > <textview android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontalbottom" android:text="@string/pull_to_refresh" /> <textview android:id="@+id/updated_at" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontaltop" android:text="@string/updated_at" /> </linearlayout> </linearlayout> </relativelayout> 在这个布局中,我们包含了一个下拉指示箭头,一个下拉状态文字提示,和一个上次更新的时间。当然,还有一个隐藏的旋转进度条,只有正在刷新的时候我们才会将它显示出来。 布局中所有引用的字符串我们都放在stringsmit(); new hideheadertask()/apk/res/android" xmlns:tools="schemas/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <com.example.pulltorefreshtest.refreshableview android:id="@+id/refreshable_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > <listview android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > </listview> </com.example.pulltorefreshtest.refreshableview> </relativelayout> 可以看到,我们在自定义的refreshableview中加入了一个listview,这就意味着给这个listview加入了下拉刷新的功能,就是这么简单! 然后我们再来看一下程序的主activity,打开或新建mainactivity,加入如下代码: 复制代码 代码如下: public class mainactivity extends activity { refreshableview refreshableview; listview listview; arrayadapter<string> adapter; string[] items = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); refreshableview = (refreshableview) findviewbyid(r.id.refreshable_view); listview = (listview) findviewbyid(r.id.list_view); adapter = new arrayadapter<string>(this, android.r.layout.simple_list_item_1, items); listview.setadapter(adapter); refreshableview.setonrefreshlistener(new pulltorefreshlistener() { @override public void onrefresh() { try { thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } refreshableview.finishrefreshing(); } }, 0); } } 可 以看到,我们通过调用refreshableview的setonrefreshlistener方法注册了一个监听器,当listview正在刷新时就 会回调监听器的onrefresh方法,刷新的具体逻辑就在这里处理。而且这个方法已经自动开启了线程,可以直接在onrefresh方法中进行耗时操 作,比如向服务器请求最新数据等,在这里我就简单让线程睡眠3秒钟。另外在onrefresh方法的最后,一定要调用refreshableview中的 finishrefreshing方法,这个方法是用来通知refreshableview刷新结束了,不然我们的listview将一直处于正在刷新的 状态。 不知道大家有没有注意到,setonrefreshlistener这个方法其实是有两个参数的,我们刚刚也是传入了一个不起眼的 0。那这第二个参数是用来做什么的呢?由于refreshableview比较智能,它会自动帮我们记录上次刷新完成的时间,然后下拉的时候会在下拉头中 显示距上次刷新已过了多久。这是一个非常好用的功能,让我们不用再自己手动去记录和计算时间了,但是却存在一个问题。如果当前我们的项目中有三个地方都使 用到了下拉刷新的功能,现在在一处进行了刷新,其它两处的时间也都会跟着改变!因为刷新完成的时间是记录在配置文件中的,由于在一处刷新更改了配置文件, 导致在其它两处读取到的配置文件时间已经是更改过的了。那解决方案是什么?就是每个用到下拉刷新的地方,给setonrefreshlistener方法 的第二个参数中传入不同的id就行了。这样各处的上次刷新完成时间都是单独记录的,相互之间就不会再有影响。 好了,全部的代码都在这里了,让我们来运行一下,看看效果吧。 效果看起来还是非常不错的。我们最后再来总结一下,在项目中引入listview下拉刷新功能只需三步: 1. 在activity的布局文件中加入自定义的refreshableview,并让listview包含在其中。 2. 在activity中调用refreshableview的setonrefreshlistener方法注册回调接口。 3. 在onrefresh方法的最后,记得调用refreshableview的finishrefreshing方法,通知刷新结束。 从此以后,在项目的任何地方,一分钟引入下拉刷新功能妥妥的。 好了,今天的讲解到此结束,有疑问的朋友请在下面留言。 源码下载,请点击这里
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯