作者:程序员小冰,GitHub主页:https://github.com/QQ986945193

新浪微博:http://weibo.com/mcxiaobing

首先给大家看一下我们今天这个最终实现的效果图:



我这里只是单纯的实现了ListView返回顶部的功能。具体效果大家可以适当地美化

在实际项目中可以换图标,去掉右侧滚动条等。具体ui美化不做解释。

好了,首先我们是当不在顶部的时候,返回顶部按钮就会出现,而到顶部之后就会隐藏此按钮,所以我们这里就要算Listview的滑动偏移量,当然,有这个返回顶部按钮,而且一直显示在底部,所以当然用相对布局了。先给大家看一下xml布局源码比较简单:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" > <ListView
android:id="@+id/my_listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" /> <Button
android:id="@+id/top_btn"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="gone"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="6dp"
android:layout_marginRight="6dp"
android:background="@mipmap/top_btn_bg"
android:gravity="center"
android:text="顶" /> </RelativeLayout>

然后我们需要一个获取屏幕的一个工具类,这里我封装好了,:

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import android.content.Context;
import android.view.Display;
import android.view.View;
import android.view.WindowManager; /**
* @author :程序员小冰
* @新浪微博 :http://weibo.com/mcxiaobing
* @GitHub: https://github.com/QQ986945193
* @CSDN博客: http://blog.csdn.net/qq_21376985
* @码云OsChina :http://git.oschina.net/MCXIAOBING
*/
public class ScreenUtil { /**
* 获取屏幕的宽度
*
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay(); return display.getWidth();
} /**
* 获取屏幕的高度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
return display.getHeight();
} /**
* 获取屏幕中控件顶部位置的高度--即控件顶部的Y点
*
* @return
*/
public static int getScreenViewTopHeight(View view) {
return view.getTop();
} /**
* 获取屏幕中控件底部位置的高度--即控件底部的Y点
*
* @return
*/
public static int getScreenViewBottomHeight(View view) {
return view.getBottom();
} /**
* 获取屏幕中控件左侧的位置--即控件左侧的X点
*
* @return
*/
public static int getScreenViewLeftHeight(View view) {
return view.getLeft();
} /**
* 获取屏幕中控件右侧的位置--即控件右侧的X点
*
* @return
*/
public static int getScreenViewRightHeight(View view) {
return view.getRight();
} }

好了,然后我们需要一个adapter,就是现实列表的一个简单的textview

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; /**
* @author :程序员小冰
* @新浪微博 :http://weibo.com/mcxiaobing
* @GitHub: https://github.com/QQ986945193
* @CSDN博客: http://blog.csdn.net/qq_21376985
* @码云OsChina :http://git.oschina.net/MCXIAOBING
*
* listview所需要的adapter
*/
public class MyAdapter extends BaseAdapter { private List<String> mTitleArray;// 标题数组
private LayoutInflater inflater; /**
* 构造方法
*
* @param context // 上下文对象
* @param titleArray // 标题数组
*/
public MyAdapter(Context context, List<String> titleArray) {
this.mTitleArray = titleArray;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} /**
* 获取Item总数
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
if (mTitleArray != null) {
return mTitleArray.size();
} else {
return 0;
}
} /**
* 获取一个Item对象
*/
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
if (mTitleArray != null) {
return mTitleArray.get(position);
} else {
return null;
}
} /**
* 获取指定item的ID
*/
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_layout, null);
holder.mTitleTv = (TextView) convertView
.findViewById(R.id.title_tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
} holder.mTitleTv.setText(mTitleArray.get(position));
return convertView;
} private class ViewHolder {
private TextView mTitleTv;
} }

ok,现在基本上工具都做好了,开始实现我们的重要的部分,实现返回顶部:

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; /**
* @author :程序员小冰
* @新浪微博 :http://weibo.com/mcxiaobing
* @GitHub: https://github.com/QQ986945193
* @CSDN博客: http://blog.csdn.net/qq_21376985
* @码云OsChina :http://git.oschina.net/MCXIAOBING
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ListView myListView;
private Button topBtn; private MyAdapter adapter;
private boolean scrollFlag = false;// 标记是否滑动
private int lastVisibleItemPosition = 0;// 标记上次滑动位置 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView) findViewById(R.id.my_listView);
topBtn = (Button) findViewById(R.id.top_btn); adapter = new MyAdapter(this, getTitleDatas());
myListView.setAdapter(adapter); topBtn.setOnClickListener(this);
myListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
// 当不滚动时
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 是当屏幕停止滚动时
scrollFlag = false;
// 判断滚动到底部
if (myListView.getLastVisiblePosition() == (myListView
.getCount() - 1)) {
topBtn.setVisibility(View.VISIBLE);
}
// 判断滚动到顶部
if (myListView.getFirstVisiblePosition() == 0) {
topBtn.setVisibility(View.GONE);
} break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 滚动时
scrollFlag = true;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 是当用户由于之前划动屏幕并抬起手指,屏幕产生惯性滑动时
scrollFlag = false;
break;
}
} /**
* firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
* visibleItemCount:当前能看见的列表项个数(小半个也算) totalItemCount:列表项共数
* CSDN博客: http://blog.csdn.net/qq_21376985
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 当开始滑动且ListView底部的Y轴点超出屏幕最大范围时,显示或隐藏顶部按钮
if (scrollFlag
&& ScreenUtil.getScreenViewBottomHeight(myListView) >= ScreenUtil
.getScreenHeight(MainActivity.this)) {
if (firstVisibleItem > lastVisibleItemPosition) {// 上滑
topBtn.setVisibility(View.VISIBLE);
} else if (firstVisibleItem < lastVisibleItemPosition) {// 下滑
topBtn.setVisibility(View.GONE);
} else {
return;
}
lastVisibleItemPosition = firstVisibleItem;
}
}
});
} /**
* 获取标题数据列表
*
* @return
*/
private List<String> getTitleDatas() {
List<String> titleArray = new ArrayList<String>();
for (int i = 0; i < 30; i++) {
titleArray.add("程序员小冰" + i + "个item");
}
return titleArray;
} /**
* 滚动ListView到指定位置
*
* @param pos
*/
private void setListViewPos(int pos) {
if (android.os.Build.VERSION.SDK_INT >= 8) {
myListView.smoothScrollToPosition(pos);
} else {
myListView.setSelection(pos);
}
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.top_btn:// 点击按钮返回到ListView的第一项
setListViewPos(0);
break;
}
} }

好了,教程到此结束。如果此文章帮到了你,欢迎点赞。

姊妹篇:Scrollview返回顶部,快速返回顶部的功能实现详解链接:

http://blog.csdn.net/qq_21376985/article/details/52511303

源代码需要的可以去

(AndroidStudio版)github下载地址:

https://github.com/QQ986945193/DavidToTopListView

【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。的更多相关文章

  1. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  2. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  3. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  4. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  5. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  6. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  7. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

  8. HP电脑的增霸卡功能操作详解

    机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...

  9. 【Android 应用开发】Android - TabHost 选项卡功能用法详解

    TabHost效果图 : 源码下载地址 : http://download.csdn.net/detail/han1202012/6845105        . 作者 :万境绝尘  转载请注明出处  ...

随机推荐

  1. 4.深入k8s:容器持久化存储

    从一个例子入手PV.PVC Kubernetes 项目引入了一组叫作 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象用于管理存储 ...

  2. asp.net core 2.1的全局模型验证统一方案

    网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiCont ...

  3. 04-Thread的生命周期

    图示: 说明: 1.生命周期关注两个概念:状态.相应的方法 2.关注:状态a-->状态b:哪些方法执行了(回调方法) 某个方法主动调用:状态a-->状态b 3.阻塞:临时状态,不可以作为最 ...

  4. Kaggle-pandas(1)

    Creating-reading-and-writing 戳我进原网站 教程 1.创建与导入 DataFrame import pandas as pd pd.DataFrame({'Yes': [5 ...

  5. LinuX操作系统基础------>初始并安装系统

    b了解LinuX操作系统的来历和发展史 掌握虚拟机(Vbox)的安装方法 掌握CentOS6.5的安装方法 操作系统: 操作系统简称OS ,是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的 ...

  6. 曲线生成与求交—Bezier曲线

    Bezier曲线生成 法国工程师Pierre Bezier在雷诺公司使用该方法来设计汽车.一条Bezier曲线可以拟合任何数目的控制点. 公式 设\(n+1\)个控制点\(P_0,P_1--P_n\) ...

  7. Python实现迪杰斯特拉算法

    首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...

  8. 检查型异常和非检查型异常——Java

    文章目录 检查型异常和非检查型异常--Java 检查型异常 非检查型异常 结语 检查型异常和非检查型异常--Java Java语言规范将派生于Error类或RuntimeExceprion类的所有异常 ...

  9. Flask实现RESTful API(注意参数位置解析)

    准备工作 首先安装flask_restful三方组件 pip install flask_restful 在models.py中新建一个类,生成表,往里面插入一些数据.(flask要想使用ORM的话需 ...

  10. k8s 安装 istio 的坑

    本文针对于二进制部署的k8s安装istio1.67版本 没有设置admin.conf的小伙伴请参考 https://www.cnblogs.com/Tempted/p/13469772.html 1. ...