MainActivity
package news1510a.bawei.com.a16_pulltorefresh_demo;import android.support.design.widget.TabLayout;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.util.ArrayList;import java.util.List;import news1510a.bawei.com.a16_pulltorefresh_demo.fragment.FragmentGridView;import news1510a.bawei.com.a16_pulltorefresh_demo.fragment.FragmentListView;import news1510a.bawei.com.a16_pulltorefresh_demo.fragment.FragmentScrollView;/** * 使用pullToRefresh下拉刷新和上拉加载 * 1.去github上下载压缩包,解压library复制改名,最好不要有中文路径 * 2.使用import moundle导入库文件,添加库文件依赖 * 3.此时左下角可能报错,只需点击即可install...下载16版sdk,还需要下载19版本的buildTools * * 可以看到代码 * PullToRefreshListView可以刷新的listView控件...间接继承了LinearLayout,是自定义的listView * PullToRefreshGridView可以刷新的GridView控件 * PullToRefreshExpandableListView二级列表控件可以刷新 * PullToRefreshScrollView可以刷新的ScrollView控件 * PullToRefreshWebView可以刷新的WebView控件 */public class MainActivity extends AppCompatActivity { private TabLayout tabLayout; private ViewPager viewPager; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabLayout = (TabLayout) findViewById(R.id.tl_tab); viewPager = (ViewPager) findViewById(R.id.view_pager); list = new ArrayList<>(); list.add("ListView"); list.add("GridView"); list.add("ScrollView"); viewPager.setOffscreenPageLimit(list.size()); //1.设置适配器...fragmnePagerAdapter...getChildFragmentManager...getFragmentManager viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { //2.重写方法...返回的是viewPager当前页的标题 @Override public CharSequence getPageTitle(int position) { return list.get(position); } @Override public Fragment getItem(int position) {
//0...listView,1...gridView,2..scrollView Fragment fragment = null; switch (position){ case 0: fragment = new FragmentListView(); break; case 1: fragment = new FragmentGridView(); break; case 2: fragment = new FragmentScrollView(); break; default: break; } return fragment; } @Override public int getCount() { return list.size(); } }); //3.tablayout与viewPager关联使用 tabLayout.setupWithViewPager(viewPager); }}————————————————————————————————————————————————————activity_main.xml————————————————————————————————————————————————————<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tl_tab"
android:layout_width="match_parent"
android:layout_height="40dp"
app:tabGravity="center"
app:tabIndicatorColor="@color/colorAccent"
app:tabMode="scrollable"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="@color/colorPrimary" />
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</LinearLayout>
——————————————————————————————————————————FragmentListView
——————————————————————————————————————————————————————————package news1510a.bawei.com.a16_pulltorefresh_demo.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import news1510a.bawei.com.a16_pulltorefresh_demo.R;
import news1510a.bawei.com.a16_pulltorefresh_demo.adapter.ListViewAdapter;
import news1510a.bawei.com.a16_pulltorefresh_demo.bean.DataDataBean;
import news1510a.bawei.com.a16_pulltorefresh_demo.dao.JsonDao;
import news1510a.bawei.com.a16_pulltorefresh_demo.inter.JsonCallBack;
import news1510a.bawei.com.a16_pulltorefresh_demo.util.NetDataUtil;
/**
* @author Dash
* @date 2017/10/18
* @description:
*/
public class FragmentListView extends Fragment {
private PullToRefreshListView refreshListView;
private List<DataDataBean.ResultsBean> list = new ArrayList<>();//记录当前展示的所有数据
private ListViewAdapter listViewAdapter;
private int page_num = 1;
private ILoadingLayout startLabels;
private JsonDao jsonDao;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_listview_layout,container,false);
refreshListView = view.findViewById(R.id.refresh_list_view);
return view;
}
/**
* 使用数据库做一个数据的缓存
* @param savedInstanceState
*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
jsonDao = new JsonDao(getContext());
//1.先读取数据库中存的数据....有数据,解析展示....无数据,网络获取数据
String json = jsonDao.getJson("http://gank.io/api/data/Android/10/" + page_num);
if (json != null){
//解析 显示
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//往后面添加...
list.addAll(dataDataBean.getResults());
//设置适配器
setAdapter();
}else {
//1.设置listView的适配器
getDataFromNet();
}
//2.设置刷新模式
/*设置pullToRefreshListView的刷新模式,BOTH代表支持上拉和下拉,PULL_FROM_END代表上拉,PULL_FROM_START代表下拉 */
refreshListView.setMode(PullToRefreshBase.Mode.BOTH);
//3.通过getLoadingLayoutProxy 方法来指定上拉和下拉时显示的状态的区别(也就是设置向下拉的时候头部里面显示的文字)
//此时这里设置的是下拉刷新的时候显示的文字,所以第一个设置true表示现在是刷新,第二个设置为false
startLabels = refreshListView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉刷新");
startLabels.setRefreshingLabel("正在刷新...");
startLabels.setReleaseLabel("放开刷新");
ILoadingLayout endLabels = refreshListView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉刷新");
endLabels.setRefreshingLabel("正在载入...");
endLabels.setReleaseLabel("放开刷新...");
//4.设置监听事件
/**
* 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、
* onPullUpToRefresh()两个方法。
如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,
同时实现onRefresh()方法。
当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,
Mode.PULL_FROM_END的时候只调用onPullUpToRefresh()方法
*/
refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
//下拉刷新的时候调用的方法....请求第一页的数据,清空之前的数据,然后再添加设置适配器
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
//下拉刷新....请求第一页的数据,清空之前的数据,然后再添加设置适配器
getRefreshData();
}
//上拉刷新的时候调用的方法..page++,然后在请求数据
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
//上拉刷新/加载...加载的时候页数++
page_num++;
getDataFromNet();
}
});
}
/**
* 下拉刷新获取数据
*/
private void getRefreshData() {
NetDataUtil.getData("http://gank.io/api/data/Android/10/1", getActivity(), new JsonCallBack() {
@Override
public void getJsonString(String json) {
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//先清空一下数据
list.clear();
//添加到集合的最前边,,,,(0,,,,)
list.addAll(0,dataDataBean.getResults());
//设置适配器
setAdapter();
//设置适配器之后停止刷新的操作
refreshListView.onRefreshComplete();
//可以设置刷新的时间....
startLabels.setLastUpdatedLabel("上次更新时间:"+new SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis())));//last最近的,最后一次update修改/更新
}
});
}
/**
* 刚开始进入页面获取网络数据....还可以作为上拉加载获取数据的操作
*
*
*/
private void getDataFromNet() {
//第一个参数是接口,第二个上下文,第三个回调json数据
NetDataUtil.getData("http://gank.io/api/data/Android/10/"+page_num, getActivity(), new JsonCallBack() {
@Override
public void getJsonString(String json) {
//先存入数据库
jsonDao.insertJson(json,"http://gank.io/api/data/Android/10/"+page_num);
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//往后面添加...
list.addAll(dataDataBean.getResults());
//设置适配器
setAdapter();
//停止刷新
refreshListView.onRefreshComplete();
}
});
}
private void setAdapter() {
if (listViewAdapter == null){
listViewAdapter = new ListViewAdapter(getActivity(),list);
refreshListView.setAdapter(listViewAdapter);
}else {
listViewAdapter.notifyDataSetChanged();
}
}
}
————————————————————————————————————————————————FragmentGridView
————————————————————————————————————————————————package news1510a.bawei.com.a16_pulltorefresh_demo.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshGridView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import news1510a.bawei.com.a16_pulltorefresh_demo.R;
import news1510a.bawei.com.a16_pulltorefresh_demo.adapter.GridViewAdapter;
import news1510a.bawei.com.a16_pulltorefresh_demo.bean.DataDataBean;
import news1510a.bawei.com.a16_pulltorefresh_demo.inter.JsonCallBack;
import news1510a.bawei.com.a16_pulltorefresh_demo.util.NetDataUtil;
/**
* @author Dash
* @date 2017/10/18
* @description:
*/
public class FragmentGridView extends Fragment {
private PullToRefreshGridView refreshGridView;
private int page_num = 1;
private List<DataDataBean.ResultsBean> list = new ArrayList<>();//记录当前展示的所有数据
private ILoadingLayout startLabels;
private GridViewAdapter gridViewAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gridview_layout,container,false);
refreshGridView = view.findViewById(R.id.refresh_grid_view);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//1.默认的获取第一页的数据,然后设置适配器
getDataFromNet();
//2.设置可以刷新的模式
refreshGridView.setMode(PullToRefreshBase.Mode.BOTH);
//3.设置刷新的时候展示的文字(状态)
startLabels = refreshGridView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉刷新");
startLabels.setRefreshingLabel("正在刷新...");
startLabels.setReleaseLabel("放开刷新");
ILoadingLayout endLabels = refreshGridView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉刷新");
endLabels.setRefreshingLabel("正在载入...");
endLabels.setReleaseLabel("放开刷新...");
//4.设置下拉和上拉刷新的监听事件
refreshGridView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<GridView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<GridView> refreshView) {
//下拉刷新....请求第一页的数据,清空之前的数据,然后再添加设置适配器
getRefreshData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<GridView> refreshView) {
//上拉刷新/加载...加载的时候页数++
page_num++;
getDataFromNet();
}
});
}
/**
* 下拉刷新获取数据
*/
private void getRefreshData() {
NetDataUtil.getData("http://gank.io/api/data/Android/10/1", getActivity(), new JsonCallBack() {
@Override
public void getJsonString(String json) {
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//先清空一下数据
list.clear();
//添加到集合的最前边,,,,(0,,,,)
list.addAll(0,dataDataBean.getResults());
//设置适配器
setAdapter();
//设置适配器之后停止刷新的操作
refreshGridView.onRefreshComplete();
//可以设置刷新的时间....
startLabels.setLastUpdatedLabel("上次更新时间:"+new SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis())));//last最近的,最后一次update修改/更新
}
});
}
/**
* 刚开始进入页面获取网络数据....还可以作为上拉加载获取数据的操作
*
*
*/
private void getDataFromNet() {
//第一个参数是接口,第二个上下文,第三个回调json数据
NetDataUtil.getData("http://gank.io/api/data/Android/10/"+page_num, getActivity(), new JsonCallBack() {
@Override
public void getJsonString(String json) {
//解析
Gson gson = new Gson();
DataDataBean dataDataBean = gson.fromJson(json, DataDataBean.class);
//往后面添加...
list.addAll(dataDataBean.getResults());
//设置适配器
setAdapter();
//停止刷新
refreshGridView.onRefreshComplete();
}
});
}
/**
* 设置适配器的方法
*/
private void setAdapter() {
if (gridViewAdapter == null){
gridViewAdapter = new GridViewAdapter(getActivity(),list);
refreshGridView.setAdapter(gridViewAdapter);
}else {
gridViewAdapter.notifyDataSetChanged();
}
}
}
————————————————————————————————————————————FragmentScrollView
——————————————————————————————————————————————package news1510a.bawei.com.a16_pulltorefresh_demo.fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.ScrollView;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshScrollView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import news1510a.bawei.com.a16_pulltorefresh_demo.R;
import news1510a.bawei.com.a16_pulltorefresh_demo.adapter.ListViewAdapter;
import news1510a.bawei.com.a16_pulltorefresh_demo.adapter.ViewPagerAdapter;
import news1510a.bawei.com.a16_pulltorefresh_demo.bean.DataDataBean;
import news1510a.bawei.com.a16_pulltorefresh_demo.bean.LunBoBean;
import news1510a.bawei.com.a16_pulltorefresh_demo.inter.JsonCallBack;
import news1510a.bawei.com.a16_pulltorefresh_demo.util.NetDataUtil;
/**
* @author Dash
* @date 2017/10/18
* @description:
*
* 使用可以刷新的ScrollView
*
* 1.scrollView里面嵌套listView的时候出现了一种现象,,,只展示一个条目,改变高度的时候可以展示出来其他的,但是还不全
* 2.自定义一个listView,主要是重写onMeasure方法,,,,重新测量高度
* 3.ListView自动抢夺焦点,,,需要使用代码把焦点取消
*
*/
public class FragmentScrollView extends Fragment {
private PullToRefreshScrollView refreshScrollView;
private ViewPager viewPager;
private ListView listView;
private List<DataDataBean.ResultsBean> list = new ArrayList<>();//记录当前展示的所有数据
private int page_num = 1;
private ListViewAdapter listViewAdapter;
private ILoadingLayout startLabels;
private List<String> imageUrlList;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 0){
//显示下一页....拿到当前页+1
viewPager.setCurrentItem(viewPager.getCurrentItem() +1);
//再次发送消息
handler.sendEmptyMessageDelayed(0,2000);
}
}
};
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_scroll_layout, container, false);
refreshScrollView = view.findViewById(R.id.refresh_scroll_view);
viewPager = view.findViewById(R.id.image_view_pager);
listView = view.findViewById(R.id.scroll_list_view);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//失去焦点
listView.setFocusable(false);
//轮播图
lunBoTu();
//listView展示数据
//1.获取网络数据,,,展示在listView上
getDataFromNet();
//2.设置刷新模式
/*设置pullToRefreshListView的刷新模式,BOTH代表支持上拉和下拉,PULL_FROM_END代表上拉,PULL_FROM_START代表下拉 */
refreshScrollView.setMode(PullToRefreshBase.Mode.BOTH);
//3.通过getLoadingLayoutProxy 方法来指定上拉和下拉时显示的状态的区别(也就是设置向下拉的时候头部里面显示的文字)
//此时这里设置的是下拉刷新的时候显示的文字,所以第一个设置true表示现在是刷新,第二个设置为false
startLabels = refreshScrollView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉刷新");
startLabels.setRefreshingLabel("正在刷新...");
startLabels.setReleaseLabel("放开刷新");
ILoadingLayout endLabels = refreshScrollView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉刷新");
endLabels.setRefreshingLabel("正在载入...");
endLabels.setReleaseLabel("放开刷新...");
/**
* 监听事件
*/
refreshScrollView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ScrollView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ScrollView> refreshView) {
getRefreshData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ScrollView> refreshView) {
page_num++;
getDataFromNet();
}
});
}
/**
* 轮播图的方法
*/
private void lunBoTu() {
NetDataUtil.getData("http://v3.wufazhuce.com:8000/api/reading/index/?version=3.5.0&platform=android", getActivity(), new JsonCallBack() {
@Override
public void getJsonString(String json) {
//这个结合记录轮播图的所有地址
imageUrlList = new ArrayList<String>();
//解析数据
Gson gson = new Gson();
LunBoBean lunBoBean = gson.fromJson(json, LunBoBean.class);
List<LunBoBean.DataBean.EssayBean> essay = lunBoBean.getData().getEssay();
for (LunBoBean.DataBean.EssayBean essayBean: essay) {
//essayBean.getAuthor().get(0).getWeb_url()
imageUrlList.add(essayBean.getAuthor().get(0).getWeb_url());
}
//此时应该根据图片的路径,加载图片,设置适配器
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getActivity(), imageUrlList);
viewPager.setAdapter(viewPagerAdapter);
//1.手动可以无限滑动....maxValue....把当前开始展示的位