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>