android下拉,android下拉刷新控件

android 下拉滚动页面怎么实现

以下是我自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能 最近项目中需要用到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" LinearLayoutandroid:layout_width="200dip"android:layout_height="60dip"android:layout_centerInParent="true"android:orientation="horizontal" RelativeLayoutandroid: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"//RelativeLayoutLinearLayoutandroid:layout_width="0dip"android:layout_height="60dip"android:layout_weight="12"android:orientation="vertical" TextViewandroid: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" /TextViewandroid: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.RefreshableViewandroid:id="@+id/refreshable_view"android:layout_width="fill_parent"android:layout_height="fill_parent" ListViewandroid: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;ArrayAdapterString adapter;String[] items = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L" };@Overrideprotected 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 ArrayAdapterString(this, android.R.layout.simple_list_item_1, items);listView.setAdapter(adapter);refreshableView.setOnRefreshListener(new PullToRefreshListener() {@Overridepublic 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方法,通知刷新结束。从此以后,在项目的任何地方,一分钟引入下拉刷新功能妥妥的。好了,今天的讲解到此结束,有疑问的朋友请在下面留言。源码下载,请点击这里

颍州网站建设公司创新互联,颍州网站设计制作,有大型网站制作公司丰富经验。已为颍州上千余家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的颍州做网站的公司定做!

Android 下拉列表Spinner

在UI中经常会使用到下拉列表,在android控件中有两个下拉列表控件:

在xml中添加控件的使用:

主题:

这些都没有达到我要的效果:

android:entries // 传入的是values文件夹下的arrayx.xml内的数据

android:spinnerMode //显示模式有popmenu和dialog两种

android:prompt //当显示模式为dialog时生效,作用为显示dialog的标题内容

Android 6.0通知栏下拉动画缓慢的问题

最近在开发中想要实现一个下拉通知栏的功能,但是在6.0上使用方法下拉,展开动画十分缓慢,刚好在Nova launcher中,也实现了下拉通知栏,而且在6.0上提示说获取root权限,变通的解决这个问题,在酷安开发者群有朋友提到说可以在获取root权限后使用shell模拟触摸事件来实现这个方法,测试以后发现确实可行。

调用如下指令模拟手势实现下拉:

adb shell input swipe 100 1 100 500 300 模拟滑动事件 在x 100 y 1的位置滑动到 x 100 y 500的位置 历时300毫秒

此时通知栏并不会完全展开,解决方法也非常简单,再模拟一次点击事件,点击刚刚没有完全展开的状态栏即可:

adb shell input tap 100 100 模拟点击事件,点击了一下x 100 y 100的位置

这样通知栏就完全展开了

android 下拉列表

Android的下拉列表是用Spinner 这个类来实现的。

Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现),使用ArrayAdapter进行适配数据:

1:首先定义一个布局文件:

LinearLayout xmlns:android=""

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

Spinner

android:id="@+id/spinner1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

/

/LinearLayout

2:建立数据源,使用数组,这些数据将会在Spinner下来列表中进行显示:

?xml version="1.0" encoding="utf-8"?

resources

string-array name="spinnername"

item北京/item

item上海 /item

item广州/item

item深圳/item

/string-array

/resources

3:接着在Activity中加入如下的代码(使用了系统定义的下拉列表的布局文件,当然也可以自定义)

// 初始化控件

mSpinner = (Spinner) findViewById(R.id.spinner1);

// 建立数据源

String[] mItems = getResources().getStringArray(R.array.spinnername);

// 建立Adapter并且绑定数据源

ArrayAdapterString _Adapter=new ArrayAdapterString(this,android.R.layout.simple_spinner_item, mItems);

//绑定 Adapter到控件

mSpinner.setAdapter(_Adapter);

Android 下拉通知栏时Activity的生命周期——重新理解onPause()

在某个APP中,发现下拉通知栏的时候,正在播放的视频会暂停,于是有点好奇这段操作是不是在生命周期中实现的。在网上众多关于Activity生命周期的讨论中,很多人认为 onPause() 和 onStop() 的区别就是“部分遮挡”和“全部遮挡”,那按照这个猜测来分析一下这个过程:

首先,通知栏下拉一点点,符合一般描述中“Activity被部分遮挡”—— onPause()

然后,通知栏完全落下之后,“Activity被全部遮挡”—— onStop()

于是自己写了一个实例来验证:

启动APP时,毫无疑问,调用了 onCreate() → onStart() → onResume() ;

完全下拉通知栏,然后上拉通知栏,发现没有日志打印,说明 下拉通知栏对Activity的生命周期没有影响 。

经过测试不难发现,在Activity中弹出AlertDialog、Toast时,Activity的 onPause() 并没有调用;笔者还尝试在MIUI系统中唤醒小爱同学,发现 onPause() 仍然没有被调用。

但是在以下特殊的情况下, onPause() 会被调用:

跑去看文档发现了如下信息:

发现了 onPause() 和Activity的奇妙联系,就不难理解之前为什么没有被调用的问题了。

查看AlertDialog和Toast的源码,可以发现它们显示的原理,都是通过 WindowManager.addView() 来显示的。也就是说,AlertDialog和Toast可以看做是当前Activity的一部分View,当然也不会对Activity的生命周期构成影响。

因此, onPause() 是否调用的关键就是,是否有另一个Activity参与进来了。

而网上流传甚广的 onPause() 和 onStop() 调用中提到的“遮挡”,应该修正为 “被Activity遮挡”

至于官方文档中提到的, onPause() 之后会调用 onStop() 或者 onResume() ,前者很好理解,一般的退出、新启动一个全屏Activity、锁屏、返回HOME等操作都是这种情况;至于后者,笔者能想到的情况就是,弹出部分遮挡的Activity类型的对话框,然后按返回键。

android怎样自定义设置下拉列表样式

图样:

实现方式:

1、水平布局一个TextView和一个ImageView(小黑箭头)

2、实现点击ImageView的单击事件,弹出PopupWindow

3、PopupWindow中实现下拉列表

关键代码示例:

1、布局

LinearLayout android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

TextView/

ImageView /

/LinearLayout

2、单击事件

image.setBackgroundResource(R.drawable.gerendang_jiantou);  

image.setOnClickListener(new OnClickListener() {  

public void onClick(View v) {

//弹出popupwindow

}

});

3、pupupwindow相关代码

ListView lv = new ListView(this);

adapter = new OptionsAdapter(context, datas); // 根据数据,设置下拉框显示  

list.setAdapter(adapter);  

/** 

* 两种不同长度的下拉框,主要是为了适应屏幕的大小 

*/  

if (p_width  0) {  

pWindow = new PopupWindow(v, par.getWidth(), 150);  

} else {  

pWindow = new PopupWindow(v, par.getWidth(), 300);  

}  

pWindow.setFocusable(true);  //能够焦点获得

pWindow.setBackgroundDrawable(new BitmapDrawable());  //设置背景

pWindow.setOutsideTouchable(true);  //外部点击关闭

pWindow.update();  //更新位置

pWindow.showAsDropDown(text);//显示下拉列表

当前文章:android下拉,android下拉刷新控件
当前网址:https://www.cdcxhl.com/article44/dsddhee.html

成都网站建设公司_创新互联,为您提供小程序开发微信公众号做网站网站内链网站导航关键词优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作