作者:程序员小冰,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() {
if (mTitleArray != null) {
return mTitleArray.size();
} else {
return 0;
}
}
/**
* 获取一个Item对象
*/
@Override
public Object getItem(int position) {
if (mTitleArray != null) {
return mTitleArray.get(position);
} else {
return null;
}
}
/**
* 获取指定item的ID
*/
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
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) {
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) {
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) {
switch (v.getId()) {
case R.id.top_btn:
setListViewPos(0);
break;
}
}
}
好了,教程到此结束。如果此文章帮到了你,欢迎点赞。
姊妹篇:Scrollview返回顶部,快速返回顶部的功能实现详解链接:
http://blog.csdn.net/qq_21376985/article/details/52511303
源代码需要的可以去
(AndroidStudio版)github下载地址:
https://github.com/QQ986945193/DavidToTopListView
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
本篇文章将详细讲解如何在ListView中实现“返回顶部”功能,即快速回到ListView的第一项。这一功能对于用户在浏览长列表时非常方便,常见于聊天应用、新闻列表等场景。 1. **基础概念** - ListView:Android中的一...
在Android应用开发中,ListView是显示大量数据列表的常用组件,它允许用户滚动查看条目,具有很高的可定制性。本篇文章将深入解析ListView的源码,帮助开发者更好地理解和运用这个核心组件。 首先,ListView继承自...
以下将详细介绍如何在Android中实现ListView的自定义样式。 1. **自定义ListView的外观** - **自定义ListView项布局**:首先,你需要创建一个XML布局文件来定义ListView每一项的显示样式。这可以通过在`res/layout...
7. **Header和Footer**:ListView还支持添加Header和Footer视图,这可以在列表顶部或底部添加额外的信息或功能。 通过以上介绍,我们可以看出ListView在Android应用开发中的核心作用。熟练掌握ListView的使用和优化...
通常,我们需要创建一个继承自BaseAdapter的自定义Adapter,并重写其中的几个关键方法:getCount()返回数据集的大小,getItem()获取指定位置的数据,getView()则用于构建并返回ListView的一项View。在getView()中,...
本篇文章将深入解析Android ListView的position,并通过实例代码来帮助开发者更好地理解和运用。 首先,`position`是ListView中一个关键的参数,它代表了ListView中每个条目视图的位置。当用户点击ListView的某一行...
总结,ListView是Android开发中不可或缺的一部分,熟练掌握其使用方法和优化技巧,能够帮助开发者构建出功能强大且用户体验良好的应用程序。无论是简单的列表展示,还是复杂的视图组合,ListView都能提供相应的解决...
在Android开发中,ListView是一个非常常见的组件,用于展示列表数据。在使用ListView时,我们通常会为其设置一个OnItemClickListener,以便监听用户点击列表项的行为。本文将深入解析OnItemClickListener中的两个...
- 使用setOnScrollListener()可以监听ListView的滚动事件,用于实现滚动加载更多数据的功能。 5. **页面跳转** - 当用户点击ListView项时,可以使用Intent启动新的Activity,实现页面跳转。在onItemClick()方法中...
在安卓开发中,ListView是应用...以上是关于“安卓Android源码——listView1.rar”可能涉及的关键知识点,这份源码很可能会包含这些功能的实现,通过学习和分析这个项目,开发者可以深入理解ListView的使用和优化技巧。
在Android平台上开发一个记事本应用,不仅可以帮助用户记录日常生活中的琐事,还能让我们深入理解Android应用的基本架构和功能实现。本篇将详细介绍如何构建一个具备增加、删除、修改和查询功能的Android记事本应用...
在实现这一功能时,开发者首先可能会考虑使用RecyclerView或ListView,因为它们是Android中常用的列表展示组件。然而,考虑到评论与回复的层级关系(评论是一个列表,每个评论下可能有多个回复,形成子列表),嵌套...
《ListView详解:从基础到实践》 ListView是Android开发中常用的一个组件,它用于展示大量数据,具有良好的可滚动性和高效的内存管理。本教程将深入探讨ListView的基本概念、使用方法以及优化策略,帮助开发者实现...
在Android开发中,"抽屉"通常指的是DrawerLayout,它是一个用于实现滑动抽屉效果的布局组件。这个效果常见于许多应用的导航菜单,用户可以从屏幕边缘滑出或隐藏菜单,提供了一种高效的导航方式。Android Studio是...
最后,为了实现PinnedHeaderListView,开发者可以选择现有的开源库,如android-pinned-section-listview或者android-section-list,这些库已经实现了基本功能,并提供了示例代码和文档,可以快速集成到项目中。...
PinnedHeaderListView是Android开发中的一个扩展组件,它扩展了ListView的功能,允许在用户滚动列表时将特定的头部视图(通常是分组标题)固定在屏幕顶部,即使该部分数据已滚动出视线范围。这种设计使得用户能更好...
### Android面试核心知识点详解 #### 一、Java基础知识点 **1. 接口与抽象类的使用及区别** - **接口**: 在Java中,接口是一种完全抽象的类,它只包含公共的静态常量和抽象方法。实现接口的类必须提供接口中所有...
《使用RecyclerView实现分组列表详解》 在Android应用开发中,数据展示往往涉及到列表的呈现,而当数据具有层次结构时,分组列表就成了一个很好的选择。本篇文章将围绕"StickyHeaders-使用RecyclerView实现的分组...
【Android 开发】使用ViewPager与Fragment构建微信样式界面详解 在Android应用开发中,实现复杂的用户界面是一项常见的任务。微信作为一款全球用户广泛使用的社交应用,其界面设计和交互模式被许多开发者作为参考。...
PinnedHeaderListView-master 是一个专为Android设计的自定义ListView库,它扩展了标准的ListView功能,增加了固定头部的能力。这个库在处理大数据列表时尤其有用,因为它可以在用户滚动列表时保持某些部分(通常是...