- 浏览: 133193 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
newhxj:
03-21 10:56:35.850: E/Web Conso ...
Android简易Flash播放器[转] -
roiz:
谢谢 很好正需要这资料
精确监听AbsListView滚动至底部[转]
用户使用android客户端时,当ListView滚动至底部,可以由一个按钮来提示用户是否读下一页,那么如果使用GridView呢?现在很多WEB 2.0上的体验就是当底部时自动读取下一页数据,GridView(ListView也可)可以采用这种方法。网上已经有很多文章介绍了如何判断ListView是否滚动至底部,原理是 AbsListView.getLastVisiblePosition() = (AbsListView.getCount() - 1) 即到底,如果往上拖一点,用户看起来已经离开底部,但实际上 AbsListView.getLastVisiblePosition() == (AbsListView.getCount() - 1) 依然成立,会导致误判断。本文在它们基础上加以改进,做到更精确地监听是否滚动至底部。先来看看本文程序运行的效果:
本文在 Android入门第八篇之GridView(九宫图)基础上加入滚到事件判断,文件名为AutoLoadListener.java,原理是在AbsListView.getLastVisiblePosition() = =(AbsListView.getCount() - 1) 时,保存最后一个Item的绝对坐标,如果两次获取的绝对Y值都一样,即到底然后执行回调函数......源码如下:
package com.testScroll; import android.util.Log; import android.view.View; import android.widget.AbsListView; import android.widget.Toast; import android.widget.AbsListView.OnScrollListener; /** * 滚动至列表底部,读取下一页数据 */ public class AutoLoadListener implements OnScrollListener{ public interface AutoLoadCallBack { void execute(String url); } private int getLastVisiblePosition = 0,lastVisiblePositionY=0; private AutoLoadCallBack mCallback; public AutoLoadListener(AutoLoadCallBack callback) { this.mCallback = callback; } public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { //滚动到底部 if (view.getLastVisiblePosition() == (view.getCount() - 1)) { View v=(View) view.getChildAt(view.getChildCount()-1); int[] location = new int[2] ; v.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标 int y=location [1]; Log.e("x"+location[0],"y"+location[1]); if (view.getLastVisiblePosition()!=getLastVisiblePosition && lastVisiblePositionY!=y)//第一次拖至底部 { Toast.makeText(view.getContext(), "再次拖至底部,即可翻页",500).show(); getLastVisiblePosition=view.getLastVisiblePosition(); lastVisiblePositionY=y; return; } else if (view.getLastVisiblePosition()==getLastVisiblePosition && lastVisiblePositionY==y)//第二次拖至底部 { mCallback.execute(">>>>>拖至底部"); } } //未滚动到底部,第二次拖至底部都初始化 getLastVisiblePosition=0; lastVisiblePositionY=0; } } public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { } }
主程序为testScroll.java,源码如下:
package com.testScroll; import java.util.ArrayList; import java.util.HashMap; import com.testScroll.AutoLoadListener.AutoLoadCallBack; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.SimpleAdapter; import android.widget.Toast; public class testScroll extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setTitle("精确监听AbsListView滚动至底部----hellogv"); GridView gridview = (GridView) findViewById(R.id.gridview); // 生成动态数组,并且转入数据 ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 30; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.icon);// 添加图像资源的ID map.put("ItemText", "NO." + String.valueOf(i));// 按序号做ItemText lstImageItem.add(map); } // 生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 SimpleAdapter saImageItems = new SimpleAdapter(this, // 没什么解释 lstImageItem,// 数据来源 R.layout.night_item,// night_item的XML实现 // 动态数组与ImageItem对应的子项 new String[] { "ItemImage", "ItemText" }, // ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] { R.id.ItemImage, R.id.ItemText }); //添加自动读页的事件 AutoLoadListener autoLoadListener =new AutoLoadListener(callBack); gridview.setOnScrollListener(autoLoadListener); // 添加并且显示 gridview.setAdapter(saImageItems); // 添加消息处理 gridview.setOnItemClickListener(new ItemClickListener()); } AutoLoadCallBack callBack=new AutoLoadCallBack(){ public void execute(String url) { Toast.makeText(testScroll.this, url, 500).show(); } }; // 当AdapterView被单击(触摸屏或者键盘),则返回的Item单击事件 class ItemClickListener implements OnItemClickListener { public void onItemClick(AdapterView<?> arg0,// The AdapterView where the // click happened View arg1,// The view within the AdapterView that was clicked int arg2,// The position of the view in the adapter long arg3// The row id of the item that was clicked ) { // 在本例中arg2=arg3 HashMap<String, Object> item = (HashMap<String, Object>) arg0 .getItemAtPosition(arg2); // 显示所选Item的ItemText setTitle((String) item.get("ItemText")); } } }
本文来自http://blog.csdn.net/hellogv/article/details/6615487
发表评论
-
android Theme使用总结
2012-12-12 19:22 1490今天对api中style下的theme整个摸了一遍。 ... -
android优化——adapter
2012-12-12 18:56 1505什么是Adapter,可以先看看我的上一篇文章,Andr ... -
listview样式设置——自定义背景、分隔[转]
2012-12-12 14:13 822在Android中,ListView是最常用的一个控件, ... -
draw9patch不失真背景
2012-12-12 00:23 13241.背景自适应且不失真问题的存在 制作自适应背 ... -
android布局之selector(背景选择器)[转]
2012-12-11 23:07 2852关于listview和button都 ... -
android布局之RelativeLayout属性
2012-12-11 23:06 1233android:layout_above ... -
Android ListView下拉刷新点击加载更多[转]
2012-12-03 09:04 1707这个ListView的下拉刷新算是不错了。网上找了很多个 ... -
BitmapFactory.Options详解[转]
2012-11-21 20:50 3316public Bitmap in ... -
Android简易Flash播放器[转]
2012-01-20 21:16 1942上一节,大体说了下在Android程序中嵌套Flash动 ... -
将flash嵌入你的程序中[转]
2012-01-20 21:12 1222无论如何,我们需要一个android2.2的平板电脑 ... -
Android实现ListView异步加载图片[转]
2011-11-30 11:17 730ListView异步加载图片是非常实用的方法,凡是是要通过网络 ... -
可动态布局的Android抽屉之完整篇[转]
2011-11-10 09:00 1109上次介绍了基础篇,讲解了自定义抽屉控件的基 ... -
可动态布局的Android抽屉之基础[转]
2011-11-10 08:59 1589以前曾经介绍过《Android提高第十九篇 ... -
Android提高第二十一篇之MediaPlayer播放网络视频
2011-11-10 08:59 2640上次讲解了MediaPlayer播放网络音 ... -
Android提高第二十篇之MediaPlayer播放网络音频[转]
2011-11-10 08:58 789以前曾经地介绍过MediaPlayer的基本用 ... -
Android提高第十九篇之"多方向"抽屉[转]
2011-11-09 13:35 1203在android上要实现类似Launch的 ... -
Android提高十八篇之自定义Menu(TabMenu)[转]
2011-11-09 13:35 901用过UCWEB-Android版的人都应 ... -
Android提高十七篇之多级树形菜单的实现[转]
2011-11-09 13:35 896在Android里要实现树形菜单,都是用 ... -
Android提高十六篇之使用NDK把彩图转换灰度图[转]
2011-11-09 13:34 1059在Android上使 ... -
Android提高第十五篇之ListView自适应实现表格[转]
2011-11-09 13:34 874上次介绍了使用GridView实现表格, ...
相关推荐
监听滚动距离可以帮助我们精确地控制这些行为的发生时机。 在Android中,我们可以使用AbsListView的OnScrollListener接口来监听ListView的滚动事件。这个接口包含三个方法:onScrollStateChanged(), onScroll() 和 ...
- `AbsListView.OnScrollListener`: 定义了一个接口,当列表或网格滚动时,可以调用回调函数,便于实现滚动事件的监听。 - `AbsListView.RecyclerListener`: 用于监听视图被回收到缓存池时的事件,提供了一种接收...
3. AbsListView.OnScrollListener:当列表滚动时,提供回调接口,可以监听滚动开始、滚动结束等事件。 4. AbsListView.RecyclerListener:当列表项被回收时,可以通过此监听器接收到通知。 三、XML属性 AbsListView...
这需要对滚动位置和Header View的高度进行精确的计算。 6. **自定义Adapter**: 为了将Header View添加到ListView,我们可能需要自定义一个Adapter,并在`getView()`方法中返回包含Header View的完整列表项。同时...
3. **自定义滚动监听器**:除了使用ListView自带的OnScrollListener,我们可能需要自定义一个滚动监听器,以便更精确地控制反弹过程。例如,我们可以记录当前滚动位置,比较与边界的位置差,然后计算出动画的持续...
在Android应用开发中,...总之,通过监听ListView的滚动事件并结合item的位置信息,我们可以精确地判断是否到达顶部和底部,从而实现下拉刷新和上拉加载功能。这种实现方法简单高效,适用于大多数列表滚动场景。
为了提升用户体验,开发者经常会在ListView的滚动到达顶部或底部时加入一种“反弹”(overscroll)效果,即当用户尝试继续滚动到列表边界之外时,ListView会有一种回弹的动画效果。这个反弹效果通常被称为“橡皮筋...
OnScrollListener 是ListView的监听器,用来捕获用户的滚动事件;OverscrollByCompat 是处理过度滚动的核心方法,它决定了当用户滚动到边界时,列表如何做出反应。 1. **OnScrollListener**: 当ListView滚动时,...
1. **设置滚动监听器**:为ListView添加OnScrollListener,重写onScroll和onScrollStateChanged方法。在onScroll方法中获取滚动的距离,并根据这个距离调整标题栏的透明度或高度。 ```java listView....
`lmxListview`项目就满足了这种需求,它通过监听用户的触摸事件,可以精确地捕捉到用户上下滑动的意图,从而触发刷新或加载更多的操作。 在实现这个自定义ListView的过程中,主要涉及以下知识点: 1. **自定义View...
当用户滚动到接近底部时,再加载更多数据。这可以通过监听GridView的滚动事件,结合网络请求或数据库操作来实现。 总结起来,Android的GridView是一个强大的布局工具,通过适配器机制可以灵活地展示各种数据。理解...