自定義Recycler上拉載入重新整理 誰都看得懂
看懂本文需要對RecyclerView和RecyclerAdapter的基本使用有了解。也就是會用就行。
效果就是滑動最下面的item,就載入更多資料,並且最後一個item跟普通的item不一樣。

微信圖片_20181002115043.png
會判斷是否顯示到了最後一個,進行資料載入
為了縮短篇幅,下面兩個程式碼沒有給出
1.item佈局簡單,就是一個TextView,分別是R.layout.cell_string和R.layout.cell_load
2.兩個ViewHolder程式碼也簡單,裡面也只有一個TextView物件
首先準備recyclerAdapter,名字就叫StringAdapter
public class StringAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { // 這個item分為兩種 一種是正常顯示資料的item,一種是顯示“正在載入”的item public static final int NORMAL_ITEM = 1;// 正常顯示資料的item public static final int LOADER_ITEM = 2;// "正在載入" 的 item List<String> mData; // 用構造方法賦值 public StringAdapter(List<String> strings){ this.strings = strings; } @Override public int getItemCount() { // 因為除了顯示基本的資料外還需要新增一個顯示“正在載入”的item,所以要+1 return strings.size() + 1; } // 重要 這是RecyclerView.Adapter的一個方法,返回值就作為onCreateViewHolder的第二個引數 @Override public int getItemViewType(int position) { if (position == strings.size()) {// 如果是最後一個item 就顯示“正在載入”的item return LOADER_ITEM; } return NORMAL_ITEM;// 正常情況下 顯示普通的item } /** *第二個引數就是上面方法(getItemViewType)返回的 *這個方法的作用是返回一個ViewHolder 用來顯示 */ @Override public RecyclerView.ViewHolderon CreateViewHolder(ViewGroup parent,int viewType) { Context context=parent.getContext();//獲取上下文 LayoutInflater inflater = LayoutInflater.from(context); // 根據不同的viewType來返回不同的ViewHolder,從而顯示不同的Item if (viewType == NORMAL_ITEM) {// 正常的item View view = inflater.inflate(R.layout.cell_string, parent, false); return new StringHolder(view);// 使用正常的Holder } else {// “正在載入” item View view = inflater.inflate(R.layout.cell_load, parent, false); return new LoadHolder(view);// 使用 “正在載入”的Holder } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { // 我們只返回了兩種ViewHolder 分別進行不同的操作 if (holder instanceof StringHolder) { String s = strings.get(position);// 從集合中獲取資料然後顯示 ((StringHolder) holder).textView.setText(s); } else if (holder instanceof LoadHolder) { ((LoadHolder) holder).textView.setText("正在載入哦..."); } } }
ViewHolder很簡單,其中都只有一個TextView
接下來看RecyclerView的初始化
public class MainActivity extends Activity{ private int lastVisiableItem;//當前RecyclerView的最下面一個可見的Item位置 @Override protected void onCreate(Bundle savedInstanceState) { //...此處省略無關程式碼 RecyclerView recyclerView=findViewById(R.id.recycler); // 設定LayoutManager之後要使用 final LinearLayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); StringAdapter adapter=new StringAdapter(list); recyclerView.setAdapter(adapter); // 以上都是基本操作 重點看下面的程式碼給recyclerView新增滑動事件監聽 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ /** * 當RecyclerView滑動狀態改變時會回撥此方法 * newState就是當前狀態 分別有三種 */ @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // new Sate的狀態 // RecyclerView.SCROLL_STATE_IDLE:滑動已經停止 // RecyclerView.SCROLL_STATE_DRAGGING: 在手指的操作下滑動 // RecyclerView.SCROLL_STATE_SETTLING:在慣性的作用下滑動 // 當RecyclerView停止在最後一個Item(LoadViewHodler)時,要載入資料 if(newState==RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem+1==adapter.getItemCount()){ // 這樣條件成立的情況下就是顯示了最後一個"正在載入"的ViewHolder // TODO 此處可以進行資料載入等各種操作 } } /** *RecyclerView一滑動就回調此方法 我們可以在這個方法裡面獲取 *RecyclerView最後一個顯示Item的位置 */ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // 獲取最後一個可見的item lastVisibleItem = layoutManager.findLastVisibleItemPosition(); } }); } }
這樣就可以監聽是否滑倒最後一個item了。可以按照需求進行具體的操作。