RecyclerView上啦刷新下拉加载

本文介绍了一个使用RecyclerView的示例应用,展示了如何实现数据的上下拉刷新及加载更多功能。通过自定义Adapter、SwipeRefreshLayout和EndLessOnScrollListener等组件,实现了流畅的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.administrator.recyclerview;

import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;


import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements   SwipeRefreshLayout.OnRefreshListener{

    private RecyclerView recyclerView;
    private List<String>mDatas;
    private SimpleAdapter myAdapter;

    private SwipeRefreshLayout mRefreshLayout;
    private LinearLayoutManager mLinearLayoutManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        initViews();
        initDatas();

        //绑定适配器
        myAdapter=new SimpleAdapter(this,mDatas);
        //为RecyclerView加载Adapter
        recyclerView.setAdapter(myAdapter);

        //设置RecyclerView的布局管理
        LinearLayoutManager layoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(layoutManager);

        //设置RecyclerView的分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));


        //监听SwipeRefreshLayout.OnRefreshListener
        mRefreshLayout.setOnRefreshListener(this);

        mLinearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(mLinearLayoutManager);

        /**
         * 监听addOnScrollListener这个方法,新建我们的EndLessOnScrollListener
         * 在onLoadMore方法中去完成上拉加载的操作
         * */
        recyclerView.addOnScrollListener(new EndLessOnScrollListener(mLinearLayoutManager) {
            @Override
            public void onLoadMore(int currentPage) {
                loadMoreData();
            }
        });
    }

//初始化界面
    private void initViews(){

        recyclerView= (RecyclerView) findViewById(R.id.id_recyclerView);
        mRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.layout_swipe_refresh);
        //这个是下拉刷新出现的那个圈圈要显示的颜色
        mRefreshLayout.setColorSchemeResources(
                R.color.colorRed,
                R.color.colorYellow,
                R.color.colorGreen
        );
    }

    //初始化一开始加载的数据
    private void initDatas(){
        mDatas=new ArrayList<String>();
        for (int i=0; i<=10; i++){
            /*mDatas.add(""+(char)i);*/
            mDatas.add("Item"+i);
        }

    }

    //每次上拉加载的时候,就加载十条数据到RecyclerView中
    private void loadMoreData(){
        for (int i =0; i < 10; i++){
            mDatas.add("嘿,我是“上拉加载”生出来"+i);
            myAdapter.notifyDataSetChanged();
            mRefreshLayout.setRefreshing(false);
        }
    }
    /**
     * 重写SwipeRefreshLayout.OnRefreshListener的OnRefresh方法
     * 在这里面去做下拉刷新的操作
     */
    @Override
    public void onRefresh() {
        updateData();
        //数据重新加载完成后,提示数据发生改变,并且设置现在不在刷新
        myAdapter.notifyDataSetChanged();
        mRefreshLayout.setRefreshing(false);
    }
    private void updateData(){
        //我在List最前面加入一条数据
        mDatas.add(0, "嘿,我是“下拉出来的”");
    }

}

package com.example.administrator.recyclerview;

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

/**
 * This class is from the v7 samples of the Android SDK. It's not by me!
 * <p/>分割线----工具类
 * See the license above for details.
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration
{

   private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

   public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

   public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
   
   

   private Drawable mDivider;

   private int mOrientation;

   public DividerItemDecoration(Context context, int orientation)
   {
      final TypedArray a = context.obtainStyledAttributes(ATTRS);
      mDivider = a.getDrawable(0);
      a.recycle();
      setOrientation(orientation);
   }

   public void setOrientation(int orientation)
   {
      if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
      {
         throw new IllegalArgumentException("invalid orientation");
      }
      mOrientation = orientation;
   }

   @Override
   public void onDraw(Canvas c, RecyclerView parent)
   {

       if (mOrientation == VERTICAL_LIST) {
               drawVertical(c, parent);
           } else {
               drawHorizontal(c, parent);
           }
   }

   public void drawVertical(Canvas c, RecyclerView parent)
   {
      final int left = parent.getPaddingLeft();
      final int right = parent.getWidth() - parent.getPaddingRight();

      final int childCount = parent.getChildCount();

      for (int i = 0; i < childCount; i++)
      {
         final View child = parent.getChildAt(i);
         RecyclerView v = new RecyclerView(
               parent.getContext());
         final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
               .getLayoutParams();
         final int top = child.getBottom() + params.bottomMargin;
         final int bottom = top + mDivider.getIntrinsicHeight();
         mDivider.setBounds(left, top, right, bottom);
         mDivider.draw(c);
      }
   }

   public void drawHorizontal(Canvas c, RecyclerView parent)
   {
      final int top = parent.getPaddingTop();
      final int bottom = parent.getHeight() - parent.getPaddingBottom();

      final int childCount = parent.getChildCount();
      for (int i = 0; i < childCount; i++)
      {
         final View child = parent.getChildAt(i);
         final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
               .getLayoutParams();
         final int left = child.getRight() + params.rightMargin;
         final int right = left + mDivider.getIntrinsicHeight();
         mDivider.setBounds(left, top, right, bottom);
         mDivider.draw(c);
      }
   }

   @Override
   public void getItemOffsets(Rect outRect, int itemPosition,
         RecyclerView parent)
   {
      if (mOrientation == VERTICAL_LIST)
      {
         outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
      } else
      {
         outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
      }
   }
}
package com.example.administrator.recyclerview;

import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

/**
 * 刷新工具类
 * Created by Administrator on 2016/11/9 0009.
 */
public abstract class EndLessOnScrollListener extends  RecyclerView.OnScrollListener{


    //声明一个LinearLayoutManager
    private LinearLayoutManager mLinearLayoutManager;

    //当前页,从0开始
    private int currentPage = 0;

    //已经加载出来的Item的数量
    private int totalItemCount;

    //主要用来存储上一个totalItemCount
    private int previousTotal = 0;

    //在屏幕上可见的item数量
    private int visibleItemCount;

    //在屏幕可见的Item中的第一个
    private int firstVisibleItem;

    //是否正在上拉数据
    private boolean loading = true;

    public EndLessOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();

        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if(loading){

            Log.d("wnwn", "firstVisibleItem: " + firstVisibleItem);
            Log.d("wnwn","totalPageCount:" +totalItemCount);
            Log.d("wnwn", "visibleItemCount:" + visibleItemCount);

            if(totalItemCount > previousTotal){
                //说明数据已经加载结束
                loading = false;
                previousTotal = totalItemCount;
            }
        }

        //这里需要好好理解
        if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){
            currentPage ++;
            onLoadMore(currentPage);
            loading = true;
        }
    }

    /**
     * 提供一个抽闲方法,在Activity中监听到这个EndLessOnScrollListener
     * 并且实现这个方法
     * */
    public abstract void onLoadMore(int currentPage);
}


package com.example.administrator.recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 适配器
 * Created by Administrator on 2016/11/8 0008.
 */
public class SimpleAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private LayoutInflater layoutInflater;
    private Context context;
    private List<String>mDatas;

    SimpleAdapter(Context context, List<String> datas){
        this.context=context;
        this.mDatas=datas;
        layoutInflater=LayoutInflater.from(context);


    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view=layoutInflater.inflate(R.layout.item_main,parent,false);
        MyViewHolder myViewHolder=new MyViewHolder(view);

        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.tv.setText(mDatas.get(position));
    }
    @Override
    public int getItemCount() {
        return mDatas==null?0:mDatas.size();
    }



}
class MyViewHolder extends RecyclerView.ViewHolder{

    TextView tv;
    public MyViewHolder(View itemView) {
        super(itemView);
        tv= (TextView) itemView.findViewById(R.id.text);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值