使用RecyclerView 和SwipeRefreshLayout实现上拉加载更多功能

   我们都知道,SwipeRefreshLayout只支持下拉刷新功能,并没有上拉加载更多功能,那么如何实现它的上拉加载更多的功能呢?

  上拉加载或者说滚动到底部时自动加载,都是通过判断是否滚动到了ListView或者其他View的底部,然后触发相应的操作.

我们以recyclerView为例,实现下拉刷新和上拉加载更多的功能.


代码:


MainActivity中:
import android.os.Handler;
import android.os.Message;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 android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private SwipeRefreshLayout swipeRefreshLayout; private List<String> total=new ArrayList<>(); MyAdapter myAdapter; boolean isRefreshing; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 100://上拉加载更多 isRefreshing=false; total.remove(""); myAdapter.notifyDataSetChanged(); break; case 200://下拉刷新 isRefreshing=false; swipeRefreshLayout.setRefreshing(false); myAdapter.notifyDataSetChanged(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshView); final LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); initData(); myAdapter= new MyAdapter(total, this); recyclerView.setAdapter(myAdapter); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int lastVisibleItemPosition = manager.findLastVisibleItemPosition(); if (lastVisibleItemPosition==myAdapter.getItemCount()-1){ isRefreshing=swipeRefreshLayout.isRefreshing(); if (!isRefreshing){ isRefreshing=true; initData(); handler.sendEmptyMessageDelayed(100,3000); Toast.makeText(MainActivity.this, "已经是最后啦", Toast.LENGTH_SHORT).show(); } } } }); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { new Thread(){ @Override public void run() { super.run(); try { sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } total.clear(); initData(); handler.sendEmptyMessage(200); } }.start(); } }); } private void initData() { for (int i = 0; i < 20; i++) { total.add("苹果"+i); } total.add(""); }}



MyAdapter中:
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.List;

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private List<String> list;
    private Context context;
    private LayoutInflater inflater;

    private final int TYPE_FOOTER_VIEW=0;
    private final int TYPE_ITEM_VIEW=1;


    public MyAdapter(List<String> list, Context context) {
        this.list = list;
        this.context = context;
        inflater=LayoutInflater.from(context);
    }

    @Override
    public int getItemViewType(int position) {
        if (position==getItemCount()-1){
            return TYPE_FOOTER_VIEW;
        }
        return TYPE_ITEM_VIEW;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType==TYPE_FOOTER_VIEW){
            View view=inflater.inflate(R.layout.footer_layout,parent,false);
            return new MyFooterViewHolder(view);
        }else {
            View view=inflater.inflate(R.layout.item_layout,parent,false);
            return new MyViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder){
            ((MyViewHolder) holder).item_tv.setText(list.get(position));
        }
    }


    @Override
    public int getItemCount() {
        return list.size();
    }


    //item的ViewHolder
    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView item_tv;

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

    //foot的ViewHolder
    class MyFooterViewHolder extends RecyclerView.ViewHolder {
        public MyFooterViewHolder(View itemView) {
            super(itemView);
        }
    }
}

activity_main中:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.pullrecyclerviewdemo.MainActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:id="@+id/swipeLayout"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>


    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

item_layout 中:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardElevation="10dp"
    app:cardCornerRadius="10dp"
    android:layout_margin="10dp"
    app:cardBackgroundColor="@android:color/holo_blue_light"
    >

    <TextView
        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp"
        android:textColor="@android:color/white"
        android:layout_gravity="center"

        />

</android.support.v7.widget.CardView>


footer_layou中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_margin="10dp"
        android:text="加载更多"
        android:textSize="20sp"
        android:textColor="@android:color/black"
        />

</LinearLayout>


注:在数据源total中添加一个空的(total.add("")) 是为了给footView留一个位置,
让footView显示,然后在加载更多完成后,把那条空的数据再移除(total.remove(""))





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值