使用ListVIew解决请求数据自动翻页和自动加载更多的动能
对于经常做网络请求的程序员来说,经常会遇到请求的数据存在好几页,而我们一次请求只能将其中的一页来处理,那么有没有什么办法能够让请求的数据自动翻页呢?其次,从APP性能上来讲,假如我一页数据有20条,那么一定要全部都在同一时间开始解析吗,我们的手机屏幕不大,一次也显示不了那么多数据(一些特例除外),这样无疑给APP的性能或多或少的造成了困扰。
其实,想要解决上述的问题比我们想象中还要容易很多,废话不多说,我们直接开始解决问题~~
前提:
/**
*每页数据有二十条
*/
API = “http:www.XXXXXXXXX.com/page=1,2,3,4...”,
当然,为了大家能够普遍使用,我们使用ListView来做为实验对象(ListView的代码我就不贴了,自己写就好)
开始:
其实第一步很简单,大家也知道,在xml中写了ListView,肯定就要在Activity文件中findVIewById一下(作者在Fragment里面)
/**
* Created by Dragon丶Lz on 2016/1/22.
*/
public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener {
private ListView essay_listview;
private int page =1;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_essay,container,false);
initView(view);
initRefresh();
return view;
}
private void initView(View v){
essay_listview = (ListView) v.findViewById(R.id.esssay_lv);
}
}
由于我们是做网络请求,所以第一步很简单,当然是请求数据,而且我们暂且设定page为第一页,因为一般的数据都是从第一页开始读取:
/** * Created by Dragon丶Lz on 2016/1/22. */ public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener { private ListView essay_listview; private int page =1; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_essay,container,false); initView(view); getDataByHttp(page); initRefresh(); return view; } private void initView(View v){ essay_listview = (ListView) v.findViewById(R.id.esssay_lv); } private void getDataByHttp(int page){ /** *这里自己完成网络请求的任务 */ Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response; messageHttp = response; mHandler.sendMessage(message); } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_RESPONSE: break; default: break; } } }; }
这里可以发现,我是用了一个page作为页数的参数来传进去,这就意味着我们在后面必须动态的改变page值来实现翻页。
/** * Created by Dragon丶Lz on 2016/1/22. */ public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener { private ListView essay_listview;
private int page =1; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_essay,container,false); initView(view); getDataByHttp(page); initRefresh(); return view; } private void initView(View v){ essay_listview = (ListView) v.findViewById(R.id.esssay_lv); } private void getDataByHttp(int page){ /** *这里自己完成网络请求的任务 */ Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response; messageHttp = response; mHandler.sendMessage(message); } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_RESPONSE: dealResponse(msg.obj, 0); break; default: break; } } }; private void dealResponse(Object msg,int startPosition) { /** *这里处理数据解析 */ } }
这与我们平常做一些简单的网络请求是一模一样的,好了,也就不多说了,继续看
一次加载十个数据
private void response(Object msg,int startPosition) { /** *这里做解析数据 */ for (int i = startPosition; i < list.size() && i < startPosition + 10; i++) { dataList.add(list.get(i)); } adapter.notifyDataSetChanged(); }
首先dataList就是我们存在adapter中的List<> ,list则是一页所有数据的总和我们每次都会从开始的位置statPosition开始加10来做处理,至于stratPosition在哪里变化先不着急管我们慢慢往下看
自动翻页
/** * Created by Dragon丶Lz on 2016/1/22. */ public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener { private ListView essay_listview; private int page =1; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_essay,container,false); initView(view); getDataByHttp(page); initRefresh(); return view; } private void initView(View v){ essay_listview = (ListView) v.findViewById(R.id.esssay_lv); } private void getDataByHttp(int page){ /** *这里自己完成网络请求的任务 */ Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response; messageHttp = response; mHandler.sendMessage(message); } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_RESPONSE: dealResponse(msg.obj, 0); break; default: break; } } }; private void dealResponse(Object msg,int startPosition) { /** *这里处理数据解析 */
... } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { scrollFlag = true; } else { scrollFlag = false; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { if (messageHttp != null) { if (totalItemCount != (page - 1) * numbersInOnePage) { if (totalItemCount < numbersInOnePage * page) { dealResponse(messageHttp, totalItemCount - (page - 1) * numbersInOnePage); } else { getDataByHttp(++page); } } } } } }
我们调用了OnScrollListener这个监听,并且实现了两个方法,我们的关注重点在onScroll,在这里面的一些算法通过名字大家也可以很快的了解:
- numbersInOnePage----------单页数据的个数
2. totalItemCount ----------listview一共加载了的item个数
在这里面,我们使用了一个if 语句来进行判断,如果我们totalItemCount不等于(page - 1) * numbersInOnePage 则说明当前页还没有加载完,那么我们就继续调用解析的方式,但是注意我们的stratPosition---》》》totalItemCount - (page - 1) * numbersInOnePage,这个值大家可以自己去想想和测试一下,这里不做过多的解释。
如果等于的话,说明正好本业就已经加载完毕了,那么page++来进行翻页的功能。
到这里是不是觉得豁然开朗了呢,其实自动加载和自动翻页没有那么麻烦对吧~~~~
版权声明:本文为博主原创文章,转载请注明来源谢谢。

浙公网安备 33010602011771号