- 浏览: 335622 次
最新评论
-
ax003d:
你好,我使用这种方法,在gridview里显示图片,当图片数量 ...
ScrollView嵌套GridView、ListView的解决办法 -
yunzhu:
Firefox下有Xmarks书签同步插件,很好用,可以方便地 ...
开发人员应该具备的工具----欲善其事,先利其器 -
mjlixm:
Android入门:ContentProvider 学习了! ...
Android入门:ContentProvider -
bluesky329:
很好收益匪浅!
一个软件工程师的经验之谈 -
qinglongyun:
每天工作4小时的程序员
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
用户使用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值都一样,即到底然后执行回调函数......源码如下:
- <span style= "font-family:Comic Sans MS;" > 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) {
- }
- }
- </span>
主程序为testScroll.java,源码如下:
- <span style= "font-family:Comic Sans MS;" > 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" ));
- }
- }
- }
- </span>
发表评论
-
Android入门:ContentProvider
2012-07-02 00:06 1978一、ContentProvider介绍 Cont ... -
Android入门:监听ContentProvider数据改变
2012-07-02 00:06 1439一、监听ContentProvider主要步骤 1 ... -
android 使用广播接收者监听短信和拦截外拨电话
2012-06-27 23:31 2217如果你想监听自己或者别人接收到的短信,设置黑名单等功能, ... -
android 广播接收者--BroadcastReceiver
2012-06-27 23:30 3568BroadcastReceiver初识: ... -
一个项目只使用一个Activity初探
2012-06-27 23:29 995提供一个简单案例: 1,新建一个项目 修改和添加 ... -
android 之访问WebService显示手机号码归属地
2012-06-27 23:27 1486发送XML 通过URL封装路径打开一个HttpURLC ... -
Android开发从入门到精通(8) _9
2012-04-24 21:45 2479Spinner 第八章(9) 在本节中将为Spinne ... -
Android开发从入门到精通(8) _8
2012-04-24 21:44 994RadioGroup 第八章(8) 在本章中将为Rad ... -
Android开发从入门到精通(8) _7
2012-04-24 21:43 985EditText 第八章(7) 在本节中,和上一节很类 ... -
Android开发从入门到精通(8) _6
2012-04-24 21:43 870CheckBox 第八章(6) 在本节中,将为Chec ... -
Android开发从入门到精通(8) _5
2012-04-24 21:42 904按钮 第八章(5) 看看下面的代码。这段代码代表了四个 ... -
Android开发从入门到精通(8) _4
2012-04-23 22:18 1084为AutoComplete创建一个 ... -
Android开发从入门到精通(8) _3
2012-04-23 22:17 1207使用菜单 第八章(3) 在本节中,你将建造一个应用 ... -
Android开发从入门到精通(8) _2
2012-04-23 22:17 1115修改AndroidManifest.xml文件 第八章( ... -
Android开发从入门到精通(8) _1
2012-04-23 22:16 909列表,菜单和其它Views 第八章(1) 关键技能 & ... -
Android开发从入门到精通(7) _8
2012-04-23 22:16 1113试试这个:修改AndoridPhoneDialer项目 ... -
Android开发从入门到精通(7) _7
2012-04-22 15:14 1010执行一个EditText View 第七章(7) ... -
Android开发从入门到精通(7) _6
2012-04-22 15:13 1153修改AndroidPhoneDialer 第七章(6) ... -
Android开发从入门到精通(7) _5
2012-04-22 15:13 929编辑活动许可 第七章(5) 大多数的Activit ... -
Android开发从入门到精通(7) _4
2012-04-22 15:12 1023在本节中你将会 ...
相关推荐
监听滚动距离可以帮助我们精确地控制这些行为的发生时机。 在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....
当用户滚动到接近底部时,再加载更多数据。这可以通过监听GridView的滚动事件,结合网络请求或数据库操作来实现。 总结起来,Android的GridView是一个强大的布局工具,通过适配器机制可以灵活地展示各种数据。理解...
`lmxListview`项目就满足了这种需求,它通过监听用户的触摸事件,可以精确地捕捉到用户上下滑动的意图,从而触发刷新或加载更多的操作。 在实现这个自定义ListView的过程中,主要涉及以下知识点: 1. **自定义View...