ListView实现分页加载(三)实现分页加载
2015-10-10 15:18
375 查看
在上一篇中,我们实现了底部布局(即带上了进度条)。没有读过的朋友可以点击下面的链接:
/article/6123605.html
但是进度条的消失,以及数据的加载我们都没有实现,那么在本节中,我们来完成分页加载。具体的效果我就不贴图了,就是第一篇效果展示的那些效果。
代码还是 有些难度。需要用到回调接口,实现ListView的下拉监听等知识以及判断何时进度条出现何时消失等。
陈述一下具体逻辑吧。首先在initView中,我们不仅要加上底布局,还应该时底布局消失。然后我们实现ListView的OnScrollListener接口,监听它的滚动。在其中的一个方法onScroll,我们可以获得到当前第一个可见item的编号以及当前有多少个可见item和总共有多少个item。这样子我们就可以轻易由计算得出是否滚动带最底部了。然后在onSrollStateChanged方法中做判断,如果滚动到最底部,就显示出正在加载数据的进度条,并完成数据的加载。但是有一个问题是,加载的数据在MainActivity里面,我们怎么在MyListView中获得加载的数据?这就要使用接口回调,我们在MyListView中设定一个回调接口,然后在MainAcivty中回调,就可以实现MyListView获得加载的数据。 好了,大体逻辑就是这样子的,剩下的就是细节上的逻辑了。我们看代码,注释解释的也很清楚了。如下:
然后我们再修改MainActivity中的代码即可,如下:
好了,一切都OK了。运行吧,看看分页加载到底是什么效果!
/article/6123605.html
但是进度条的消失,以及数据的加载我们都没有实现,那么在本节中,我们来完成分页加载。具体的效果我就不贴图了,就是第一篇效果展示的那些效果。
代码还是 有些难度。需要用到回调接口,实现ListView的下拉监听等知识以及判断何时进度条出现何时消失等。
陈述一下具体逻辑吧。首先在initView中,我们不仅要加上底布局,还应该时底布局消失。然后我们实现ListView的OnScrollListener接口,监听它的滚动。在其中的一个方法onScroll,我们可以获得到当前第一个可见item的编号以及当前有多少个可见item和总共有多少个item。这样子我们就可以轻易由计算得出是否滚动带最底部了。然后在onSrollStateChanged方法中做判断,如果滚动到最底部,就显示出正在加载数据的进度条,并完成数据的加载。但是有一个问题是,加载的数据在MainActivity里面,我们怎么在MyListView中获得加载的数据?这就要使用接口回调,我们在MyListView中设定一个回调接口,然后在MainAcivty中回调,就可以实现MyListView获得加载的数据。 好了,大体逻辑就是这样子的,剩下的就是细节上的逻辑了。我们看代码,注释解释的也很清楚了。如下:
package com.fuly.load; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListView; public class MyListView extends ListView implements OnScrollListener{ private int lastVisibleItem;//最后一个可见的item private int totalItemCount;//总的item private boolean isLoading = false;//是否正在加载数据 private ILoadListener mListener;//回调接口,用来加载数据 private View footer;//底布局 //注意,三个构造方法都要重写 public MyListView(Context context) { super(context); initView(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } //定义一个回调接口,用来获得要加载的数据 public interface ILoadListener{ void loadData(); } public void setOnILoadListener(ILoadListener listener){ this.mListener = listener; } //初始化view private void initView(Context context){ footer = LayoutInflater.from(context).inflate(R.layout.footer, null); //注意,这句代码的意思是给自定义的ListView加上底布局 this.addFooterView(footer); //首先需要隐藏这个底部布局 footer.findViewById(R.id.load_layout).setVisibility(View.GONE); this.setOnScrollListener(this);//千万别忘记设定监听器 } //加载数据完成后,需要执行的操作 public void loadFinish(){ isLoading = false;//不再加载了 //底布局也要隐藏 footer.findViewById(R.id.load_layout).setVisibility(View.GONE); } //参数scrollState表示滑动的状态 public void onScrollStateChanged(AbsListView view, int scrollState) { //如果最后一个可见item等于总的item,且当前滚动状态为滚动停止,就应该开始加加载数据了 if(lastVisibleItem == totalItemCount && scrollState==SCROLL_STATE_IDLE){ if(!isLoading){ isLoading = true; //加载数据 mListener.loadData(); //设置底布局可见 footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE); } } } /*** * 该方法用来监听实时滚动中的item * firstVisibleItem:当前第一个可见的item * visibleItemCount:当前总共有多少个可见的item * totalItemCount:总的item */ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.lastVisibleItem = firstVisibleItem + visibleItemCount; this.totalItemCount = totalItemCount; } }
然后我们再修改MainActivity中的代码即可,如下:
package com.fuly.load; import java.util.ArrayList; import java.util.List; import com.fuly.load.MyListView.ILoadListener; import android.os.Bundle; import android.os.Handler; import android.app.Activity; public class MainActivity extends Activity implements ILoadListener{ private MyListView lv; private List<MyData> mDatas = new ArrayList<MyData>(); private MyAdapter mAdapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData();//该方法初始化数据 lv = (MyListView) findViewById(R.id.list_view); lv.setOnILoadListener(this); mAdapter = new MyAdapter(this, mDatas); lv.setAdapter(mAdapter); } /** * 该方法初始化数据,即提供初始的素材 */ private void initData() { for(int i = 0;i<12;i++){ MyData md = new MyData("你好,我是提前设定的"); mDatas.add(md); } } /** * 该方法提供模拟的加载数据 */ private void getLoadData() { for(int i = 0;i<3;i++){ MyData md = new MyData("你好,我是加载进来的"); mDatas.add(md); } } //重写回调方法 public void loadData() { //注意之所以使用Handlder,主要是想让下面的 //操作延迟5秒钟,以体现效果。实际开发中不需要 Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable(){ public void run() { //获得加载数据 getLoadData(); //然后通知MyListView刷新界面 mAdapter.notifyDataSetChanged(); //然后通知加载数据已经完成了 lv.loadFinish(); } }, 5000); } }
好了,一切都OK了。运行吧,看看分页加载到底是什么效果!
相关文章推荐
- 【SSH】——梳理三大框架
- Android的MVP模式应用(Login)
- 用户空间与内核的接口
- 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
- UIView 的 属 性
- 傅里叶变换
- 漂亮的CSS3圆角按钮组合DEMO演示
- AspectJ切入点语法详解(最全,不需要看其他了)
- Android开发最佳实践
- 第三章 ANR
- cocos各平台横屏竖屏设置方式
- js获取高度
- 利用oracle dbms_scheduler执行windows的bat脚本加载数据
- RDVTabBarController--可自由定制的iOS底部导航控件
- MVC 调试页面路径变成 Views/Controller/Action.cshtml问题
- FreeRTOS 中断优先级嵌套错误引发HardFault异常解决(转)
- insert失败自动执行update(duplicate先insert)
- SQL总结(一)基本查询
- jQuery中的.height()、.innerHeight()和.outerHeight()
- mod_jk配置