pulltorefresh_demo2
时间:2023-01-25 07:30:00
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 Listlist; @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————————————————————————————————————————————————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 () { //下拉刷新的时候调用的方法....请求第一页的数据,清空之前的数据,然后再添加设置适配器 @Override public void onPullDownToRefresh(PullToRefreshBase refreshView) { //下拉刷新....请求第一页的数据,清空之前的数据,然后再添加设置适配器 getRefreshData(); } //上拉刷新的时候调用的方法..page++,然后在请求数据 @Override public void onPullUpToRefresh(PullToRefreshBase 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————————————————————————————————————————————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 () { @Override public void onPullDownToRefresh(PullToRefreshBase refreshView) { //下拉刷新....请求第一页的数据,清空之前的数据,然后再添加设置适配器 getRefreshData(); } @Override public void onPullUpToRefresh(PullToRefreshBase 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 Listlist = new ArrayList<>();//记录当前展示的所有数据 private int page_num = 1; private ListViewAdapter listViewAdapter; private ILoadingLayout startLabels; private List 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 () { @Override public void onPullDownToRefresh(PullToRefreshBase refreshView) { getRefreshData(); } @Override public void onPullUpToRefresh(PullToRefreshBase 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 (); //解析数据 Gson gson = new Gson(); LunBoBean lunBoBean = gson.fromJson(json, LunBoBean.class); List 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....把当前开始展示的位