天天看点

RecyclerView之上拉加载

RecyclerView之上拉加载      
RecyclerView中addOnScrollListener()方法可以监听RecyclerView的滑动,只需要最后一个显示的位置可见时就再次加载,可以达到分页加载的目的,但是要防止重复加载,      
避免用户在加载进行中不断重复操作导致重复加载      
下面举例子:      
共有1个MainActivity,1个Adapter为MainAdapter,2个ViewHolder为FooterHolder、MainHolder,1个model为Message,3个布局文件activity_main.xml、item_foot.xml、main_list_layout.xml      
MainActivity.class      
package com.example.zj.sw;

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 mRecyclerView;
    private MainAdapter mCatalogAdapter;
    private boolean isLoading = false;   //加载标志位
    private Integer page = 1;    //初始化页数
    private Integer classfiPageCount =10;   //总页数
    private List<Message> catalogbook = new ArrayList<>();   //需要显示的数组
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final LinearLayoutManager manager = new LinearLayoutManager(this);
        mCatalogAdapter = new MainAdapter(this, catalogbook);
        mRecyclerView = (RecyclerView) findViewById(R.id.catalog_recycle);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {   //监听滑动事件
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                int lastposition = manager.findLastVisibleItemPosition();
                if (page < classfiPageCount) {
                    if (lastposition == mCatalogAdapter.getItemCount() - 1) {    //可见最后一行为数据的最后一个
                        if (!isLoading) {
                            isLoading = true;  //标志位  防止重复加载数据
                           //  ......省略代码发送网络请求回调setData()方法
                        }
                    }
                } else {
                    if (lastposition == mCatalogAdapter.getItemCount() - 1) {
                        mCatalogAdapter.notifyItemRemoved(mCatalogAdapter.getItemCount());
                        Toast.makeText(MainActivity.this, "没有数据了", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        mRecyclerView.setAdapter(mCatalogAdapter);
    }



    //请求成功
    public void setData(List<Message> messageList) {
        if (mCatalogAdapter != null) {
            mCatalogAdapter.notifyItemRemoved(mCatalogAdapter.getItemCount());
        }
        catalogbook.addAll(messageList);
        mCatalogAdapter.notifyDataSetChanged();
        isLoading = false;  //加载完成数据   更新标志位

    }
}
      
MainAdapter.class      
public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<Message> catalogbook;
    private Context context;
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_FOOTER = 1;
    public MainAdapter(Context context, List<Message> message)
    {
        catalogbook = message;
        this.context = context;
    }

    public void onBindViewHolder(MainHolder holder, int position) {
        Message book = catalogbook.get(position);
        holder.bindBook(context,book);
    }
    public int getItemCount() {
        if(catalogbook.size() < 4)   //当现实行数小于屏幕所见行数。可以根据自己的实际情况来定
        {
            return  catalogbook.size()== 0 ? 0 : catalogbook.size();   //不显示底部加载
        }else {
           return catalogbook.size() == 0 ? 0 : catalogbook.size() + 1;
        }
    }

    @Override
    public int getItemViewType(int position) {
            if (position < catalogbook.size()) {
                return TYPE_ITEM;
            }else {
                return TYPE_FOOTER;
            }
    }

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            View view = layoutInflater.inflate(R.layout.main_list_layout,parent,false);
            return new MainHolder(view);
        } else if (viewType == TYPE_FOOTER) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot, parent, false);
            return new FooterHolder(view);
        }
        return null;
    }

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MainHolder) {
            MainHolder cataloghold = (MainHolder) holder;
            Message book = catalogbook.get(position);
            cataloghold.bindBook(context,book);
        }
    }
}      
FooterHolder.class      
public class FooterHolder extends RecyclerView.ViewHolder{

    public FooterHolder(View itemView) {
        super(itemView);
    }
}      
MainHolder.class      
public class MainHolder extends RecyclerView.ViewHolder implements View.OnClickListener{      
private Message mMessage;
    private TextView name_book;
    private Context mContext;

    public MainHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        name_book = (TextView) itemView.findViewById(R.id.name_book);
    }
    public void bindBook(Context context, Message abook)
    {
        mMessage = abook;
        mContext = context;
        name_book.setText(mMessage.getBookName());
    }

    @Override
   public void onClick(View view) {

    }
}
      
activity_main.xml      
<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.zj.sw.MainActivity">

    <android.support.v7.widget.RecyclerView

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/catalog_recycle"
        tools:context="com.wenrenjie.szyd_v3.CatalogActivity"
        >
    </android.support.v7.widget.RecyclerView>
</RelativeLayout>
      
item_foot.xml      
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
            android:id="@+id/foot_data"
            xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
            <ProgressBar
           android:layout_marginRight="6dp"
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleInverse"
             android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="正在加载" />

</LinearLayout>
      
main_list_layout.xml      
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_marginTop="15dp"
              android:layout_height="wrap_content"
              >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/name_book"
            android:textSize="16sp"
            android:layout_marginBottom="5dp"
            android:textColor="#3c3c3c"
            />


</LinearLayout>      

继续阅读