开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用

其实这个不是什么新东西了,在介绍(一)中我们就知道了PullToRefreshListView的用法,这里只要将其放入到ViewPager中就行啦。ViewPager还是和以往一样的定义和使用,在适配器中存视图的时候放入PullToRefreshListView就行。
1.ViewPager的布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#000000"> <!-- The PullToRefreshListView replaces a standard ListView widget. --> <android.support.v4.view.ViewPager
android:id="@+id/vp_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /> </LinearLayout>
2.找到ViewPager并设置适配器
private void initViewPager() {
// TODO 自动生成的方法存根
mViewPager = (ViewPager) findViewById(R.id.vp_list);
//得到设置好的view列表
ArrayList<View> viewList = setListViewInVp();
mViewPager.setAdapter(new ListViewPagerAdapter(viewList));
}
适配器:
/**
* @author:Jack Tony
* @tips :viewPager的适配器
* @date :2014-10-14
*/
public class ListViewPagerAdapter extends PagerAdapter {
//设置list数组,传入view
private ArrayList<View> mViewList;
private int pagerNum = 0; public ListViewPagerAdapter(ArrayList<View> viewList) {
mViewList = viewList;
} public int getPagerNum() {
return pagerNum;
} @Override
public int getCount() {
return mViewList.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public void destroyItem(View arg0, int position, Object object) {
if (mViewList.get(position) != null) {
((ViewPager) arg0).removeView(mViewList.get(position));
}
} @Override
public Object instantiateItem(View container, int position) {
try {
if (mViewList.get(position).getParent() == null) {
((ViewPager) container).addView(mViewList.get(position), 0);
} else {
/*
* 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
* The specified child already has a parent. You must call
* removeView() on the child's parent first.
*/
((ViewGroup) mViewList.get(position).getParent())
.removeView(mViewList.get(position));
((ViewPager) container).addView(mViewList.get(position), 0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pagerNum = position;
}
return mViewList.get(position);
} }
3.开始设置要放入viewPager中的listView
布局文件:
layout_listview_in_viewpager.xml
<?xml version="1.0" encoding="utf-8"?>
<com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
ptr:ptrHeaderBackground="@android:color/darker_gray" />
java代码:
private ArrayList<View> setListViewInVp() {
//设置给viewpager中填充的view列表
ArrayList<View> viewList = new ArrayList<View>();
//将string数组放入适配器中
final String[] data = { "1", "2", "3","4", "5", "6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17","18", "19", "20", };
ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1, data);
//找到listView的布局,生成可以下拉刷新的listView,添加到视图列表中
LayoutInflater inflater = LayoutInflater.from(getApplication());
for (int i = 0; i < 4; i++) {
PullToRefreshListView plv = (PullToRefreshListView) inflater.inflate(
R.layout.layout_listview_in_viewpager, null);
plv.setAdapter(adapter);
plv.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// TODO 自动生成的方法存根
new GetDataTask(refreshView).execute();
}
});
viewList.add(plv);
}
return viewList;
}
4.定义异步任务
private static class GetDataTask extends AsyncTask<Void, Void, Void> {
PullToRefreshBase<?> mRefreshedView;
public GetDataTask(PullToRefreshBase<?> refreshedView) {
mRefreshedView = refreshedView;
}
@Override
protected Void doInBackground(Void... params) {
// Simulates a background job.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mRefreshedView.onRefreshComplete();
super.onPostExecute(result);
}
}
MainActivity.java的全部代码
package com.example.ptrlistviewinviewpagertest; import java.util.ArrayList; import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView; public class MainActivity extends Activity { private ViewPager mViewPager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();
} private void initView() {
// TODO 自动生成的方法存根
initViewPager();
} private void initViewPager() {
// TODO 自动生成的方法存根
mViewPager = (ViewPager) findViewById(R.id.vp_list);
//得到设置好的view列表
ArrayList<View> viewList = setListViewInVp();
mViewPager.setAdapter(new ListViewPagerAdapter(viewList));
} private ArrayList<View> setListViewInVp() {
//设置给viewpager中填充的view列表
ArrayList<View> viewList = new ArrayList<View>();
//将string数组放入适配器中
final String[] data = { "1", "2", "3","4", "5", "6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17","18", "19", "20", };
ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1, data); //找到listView的布局,生成可以下拉刷新的listView,添加到视图列表中
LayoutInflater inflater = LayoutInflater.from(getApplication());
for (int i = 0; i < 4; i++) {
PullToRefreshListView plv = (PullToRefreshListView) inflater.inflate(
R.layout.layout_listview_in_viewpager, null);
plv.setAdapter(adapter);
plv.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// TODO 自动生成的方法存根
new GetDataTask(refreshView).execute();
}
}); viewList.add(plv);
}
return viewList;
} /**
* @author:Jack Tony
* @tips :viewPager的适配器
* @date :2014-10-14
*/
public class ListViewPagerAdapter extends PagerAdapter {
//设置list数组,传入view
private ArrayList<View> mViewList;
private int pagerNum = 0; public ListViewPagerAdapter(ArrayList<View> viewList) {
mViewList = viewList;
} public int getPagerNum() {
return pagerNum;
} @Override
public int getCount() {
return mViewList.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public void destroyItem(View arg0, int position, Object object) {
if (mViewList.get(position) != null) {
((ViewPager) arg0).removeView(mViewList.get(position));
}
} @Override
public Object instantiateItem(View container, int position) {
try {
if (mViewList.get(position).getParent() == null) {
((ViewPager) container).addView(mViewList.get(position), 0);
} else {
/*
* 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
* The specified child already has a parent. You must call
* removeView() on the child's parent first.
*/
((ViewGroup) mViewList.get(position).getParent())
.removeView(mViewList.get(position));
((ViewPager) container).addView(mViewList.get(position), 0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pagerNum = position;
}
return mViewList.get(position);
} } private static class GetDataTask extends AsyncTask<Void, Void, Void> { PullToRefreshBase<?> mRefreshedView; public GetDataTask(PullToRefreshBase<?> refreshedView) {
mRefreshedView = refreshedView;
} @Override
protected Void doInBackground(Void... params) {
// Simulates a background job.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
return null;
} @Override
protected void onPostExecute(Void result) {
mRefreshedView.onRefreshComplete();
super.onPostExecute(result);
}
}
}
源码下载:http://download.csdn.net/detail/shark0017/8036901
开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用的更多相关文章
- 开源项目PullToRefresh详解(二)——PullToRefreshGridView
这里介绍的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一辙,因为这个开源项目模块化很棒,所以很容易实现.等于说我们可以按照之前使用 ...
- 开源项目PullToRefresh详解(一)——PullToRefreshListView
开源项地址:https://github.com/chrisbanes/Android-PullToRefresh 下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现.我将按照这个开 ...
- 开源项目PullToRefresh详解(三)——PullToRefreshScrollView
和前几篇文章一样,这里还是先设置布局文件,然后找到这个控件.只不过这里要简单很多. 1.布局文件 <?xml version="1.0" encoding="utf ...
- 开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用
MultiChoiceBaseAdapter是一个可以多选的BaseAdapter,使用的方式相比来说扩展性更强! 使用方式: 1.布局文件 2.写一个类继承MultiChoiceBaseAdapte ...
- 开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用
这篇其实没啥重要的,主要就算是个总结吧. 一.布局文件 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定 ...
- 开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter
上次写到了开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用,其实我们仍旧可以不使用ActionMode的,所以这里就写一个自己扩展的方法. ...
- 开源项目MultiChoiceAdapter详解(三)——MulitChoiceNormalArrayAdapter的使用
MulitChoiceNormalArrayAdapter是我自己定义的一个类,其实就是实现了MulitChoiceArrayAdapter,为什么做这个简单的实现类呢,因为这样我们在不用Action ...
- 开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用
MultiChoiceArrayAdapter其实就是可以多选的ArrayAdapter了,ArrayAdpter我们已经很熟悉了.MultiChoiceArrayAdapter这个类是抽象类,所以使 ...
- 开源项目MultiChoiceAdapter详解(一)——概要介绍
项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...
随机推荐
- VirtualBox 安装 Gentoo 小记
因为需求,尝试了一下在 VirtualBox 安装 Gentoo.虽然多年前就折腾过多次 LFS,但 Gentoo 并没有太多尝试.这次确实也经历了种种波折,到最后总算成功了,大致跨度为3天.本来手上 ...
- 浏览器输入URL后发生了什么
假如在浏览器中输入了www.cnblogs.com,然后回车 DNS解析 浏览器检查浏览器缓存是否有域名对应的IP. 浏览器查找操作系统是否有对应的DNS解析成果(hosts文件). 查找路由器缓存. ...
- 前端架构之路:Windows下安装Nodejs步骤
最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...
- Orchard学习 02、orchard 路由
Orchard对mvc路由重新做了包装,重写了asp.net的路由模块 一.路由模块类图 1.路由 Descriptor RouteDescriptor是对常规mvc路由的包装类,它的Route属性就 ...
- free命令中buffers和caches的区别
一.命令 1 2 3 4 5 [root@localhost ~]# free -m total used free shared bu ...
- js变量和函数声明的提升(转)
原文:http://zha-zi.iteye.com/blog/2037026 下面的程序是什么结果? var foo = 1; function bar() { if (!foo) { var fo ...
- 003.RAID管理
一 查看RAID组信息 [root@kauai ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Aug 29 22: ...
- ubantu18.04下Hadoop安装与伪分布式配置
1 下载 下载地址:http://mirror.bit.edu.cn/apache/hadoop/common/stable2/ 2 解压 将文件解压到 /usr/local/hadoop cd ~ ...
- db 文件 查看 打开 工具 db 中文 版 navicat 中文
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha ======= db 中文 版 navicat 中文 ======= Navicatfo ...
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...