zoukankan      html  css  js  c++  java
  • RecyclerView 下拉刷新和加载更多

    一.SwipeRefreshLayout实现下拉刷新

    1.方法API:

    setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器 
    setRefreshing(boolean):显示或者隐藏刷新进度条 
    isRefreshing():检查是否处于刷新状态 
    setColorSchemeResources():设置进度条的颜色主题,最多设置四种,以前的setColorScheme()方法已经弃用了。

    2.简单使用:

    <?xmlversionxmlversion="1.0" encoding="utf-8"?>  
    <LinearLayoutxmlns:androidLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"android:layout_width="match_parent"  
       android:layout_height="match_parent">  
        <includelayoutincludelayout="@layout/common_top_bar_layout"/>  
       <android.support.v4.widget.SwipeRefreshLayout  
           android:id="@+id/demo_swiperefreshlayout"  
           android:layout_width="fill_parent"  
           android:layout_height="fill_parent"  
            android:scrollbars="vertical"  
            >  
           <android.support.v7.widget.RecyclerView  
               android:id="@+id/demo_recycler"  
               android:layout_width="fill_parent"  
               android:layout_height="fill_parent"  
               ></android.support.v7.widget.RecyclerView>  
       </android.support.v4.widget.SwipeRefreshLayout>  
    </LinearLayout>  

    Java:

    原理:是一个刷新布局,来自兼容包v4可以运行在低版本,控件如果想要支持下拉刷新,只要使用当前布局包裹 
    setColorSchemeColors:修改旋转颜色,可以添加多种颜色 
    setRefreshing: 是否显示loading状态 
    setOnRefreshListener:下拉刷新监听

     1 public class MainActivity extends AppCompatActivity {
     2     private SwipeRefreshLayout swipeRefreshLayout;
     3     protected void onCreate(Bundle savedInstanceState) {
     4                  ·····
     5    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);
     6         //设置旋转的颜色效果
     7         swipeRefreshLayout.setColorSchemeColors(Color.GREEN, Color.YELLOW, Color.RED);
     8         //设置下拉刷新的监听器
     9         swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    10             public void onRefresh() {
    11                 requestData();
    12             }
    13         });
    14     }
    15     private void requestData() {
    16         new Handler().postDelayed(new Runnable() {//延时加载
    17        public void run() {
    18                 String json = "{name:小米}";
    19                 TextView text = (TextView) findViewById(R.id.text);
    20                 text.setText(json);
    21                 swipeRefreshLayout.setRefreshing(false);//关闭显示
    22             }
    23         }, 2000);
    24     }

    二.加载更多——上滑加载数据 
    思路:

    1.滚动到底部 getItemCount()-2 ==bottomPosition 
    2.不处理滚动中 
    OnScrollListener监听滚动加载的监听器 
    int dy 滚动距离,向上滚动为正 
    layoutManager.findLastVisibleItemPosition获取处于底部数据的下标 
    dy>0与isLoading 都是用来控件灵敏度

     1 public class HomeFragment extends Fragment {
     2         private SwipeRefreshLayout swipeRefreshLayout;
     3         private RecyclerView recyclerView;
     4         private AppAdapter adapter;
     5         @Override
     6         public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     7                 //有一个显示网络状态
     8                 //StateLayout stateLayout  = new StateLayout(container.getContext());
     9             swipeRefreshLayout = new SwipeRefreshLayout(container.getContext());
    10             //设置颜色
    11             swipeRefreshLayout.setColorSchemeColors(Color.GREEN);
    12             //设置下拉监听
    13             swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    14                 @Override
    15                 public void onRefresh() {
    16                     HttpConnect.get(ApiUrls.HOME+"?index=0", callback);
    17                 }
    18             });
    19             recyclerView = new RecyclerView(container.getContext());
    20             //设置排列规则
    21             recyclerView.setLayoutManager(new LinearLayoutManager(container.getContext()));
    22             //预先设置了Noemal视图,但是normal视图没有内容    stateLayout.addNormalView(recyclerView);
    23             swipeRefreshLayout.addView(recyclerView);
    24             //发送请求给服务器
    25             HttpConnect.get(ApiUrls.HOME+"?index=0",callback);
    26             return swipeRefreshLayout;
    27         }
    28         DefaultCallBack callback = new DefaultCallBack() {
    29             @Override
    30             public void onStart(int what) {
    31                 swipeRefreshLayout.setRefreshing(true);
    32             }
    33             @Override
    34             public void onFinish(int what) {
    35                 swipeRefreshLayout.setRefreshing(false);
    36             }
    37             //拿到数据
    38             protected void createView(String json) {
    39                 HomeWebInfo info = new Gson().fromJson(json, HomeWebInfo.class);
    40                 //创建控件,设置适配器
    41                 adapter=new AppAdapter(info.list);
    42                 recyclerView.setAdapter(adapter);
    43                 //上滑加载数据
    44                 addLoadMoreList();
    45             }
    46         };
    47         private void addLoadMoreList(){
    48         recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
    49             private boolean isLoading = false;
    50            //int dy 上下滑动的距离 +数代表往上滑动
    51             public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    52                 super.onScrolled(recyclerView, dx, dy);
    53                 //判断 是否是排列布局
    54                 RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
    55                 //判断是否是线性排列,并且是否滑动距离
    56                 if(layoutManager instanceof  LinearLayoutManager && dy>0 ){
    57                     //当前是列表
    58                     int total = adapter.getItemCount();
    59                     int lastPosition = total-2;
    60                     //获取rv 的bottom条目
    61                     int currLastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
    62                     if(currLastPosition==lastPosition&&!isLoading){      }
    63                     isLoading=true;
    64                     Toast.makeText(MyApp.getContext(),"加载更多...",Toast.LENGTH_SHORT).show();
    65                     new Handler().postDelayed(new Runnable() {
    66                         @Override
    67                         public void run() {
    68                             Toast.makeText(MyApp.getContext(), "加载成功", Toast.LENGTH_SHORT).show();
    69                             isLoading=false;
    70                         }
    71                     },5000);
    72                 }
    73             }
    74         });
    75       }
    76   }
  • 相关阅读:
    Android使用注解代替枚举从而节省系统使用的内存开销
    android9.0系统适配遇到的问题
    android 图片上传图片 报Socket: Broken pipe
    android H5支付 网络环境未能通过安全验证,请稍后再试
    Error:Execution failed for task ':app:processDebugManifest'. Manifest merger failed with multiple errors, see logs
    NightWatch端到端测试
    JavaScript生成斐波那契数列
    Vue Material
    Jasmine
    Postman
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6480648.html
Copyright © 2011-2022 走看看