国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android RecyclerView添加上拉加載更多效果

2019-10-23 19:45:37
字體:
供稿:網(wǎng)友

先看一下效果

Android,RecyclerView添加上拉加載,RecyclerView上拉加載更多,Android添加上拉加載更多

刷新的時候是這樣的:

Android,RecyclerView添加上拉加載,RecyclerView上拉加載更多,Android添加上拉加載更多

沒有更多的時候是這樣的:

Android,RecyclerView添加上拉加載,RecyclerView上拉加載更多,Android添加上拉加載更多

既然有刷新的時候有兩種狀態(tài)就要定義兩個狀態(tài)

//普通布局的typestatic final int TYPE_ITEM = 0;//腳布局static final int TYPE_FOOTER = 1;

在特定的時候去顯示:

 @Override  public int getItemViewType(int position) {    //如果position加1正好等于所有item的總和,說明是最后一個item,將它設(shè)置為腳布局    if (position + 1 == getItemCount()) {      return TYPE_FOOTER;    } else {      return TYPE_ITEM;    }  }

然后根據(jù)這個type來inflate不同的布局:

 @Override  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    if (viewType == TYPE_ITEM) {      View view = View.inflate(mContext, R.layout.item_recycler, null);      MyViewHolder holder = new MyViewHolder(view);      return holder;    } else if (viewType == TYPE_FOOTER) {      //腳布局      View view = View.inflate(mContext, R.layout.recycler_load_more_layout, null);      FootViewHolder footViewHolder = new FootViewHolder(view);      return footViewHolder;    }    return null;  }

以上只是控制了Loading布局的出現(xiàn)可隱藏,還要2中狀態(tài)需要控制就是上面的2個圖,一個是正在加載,一個是加載完成狀態(tài),這兩個狀態(tài)在adapter里顯然是控制不了的,必須要在請求數(shù)據(jù)的時候才能知道這兩種狀態(tài),而加載數(shù)據(jù)又是在activity中執(zhí)行的,所以我們需要一個用來傳遞狀態(tài)的方法:

/**   * 改變腳布局的狀態(tài)的方法,在activity根據(jù)請求數(shù)據(jù)的狀態(tài)來改變這個狀態(tài)   *   * @param state   */  public void changeState(int state) {    this.footer_state = state;    notifyDataSetChanged();  }

用來接收狀態(tài)的變量:

//上拉加載更多// static final int PULL_LOAD_MORE = 0;  //正在加載更多  static final int LOADING_MORE = 1;  //沒有更多  static final int NO_MORE = 2;  //腳布局當(dāng)前的狀態(tài),默認(rèn)為沒有更多  int footer_state = 1;

然后就可以根據(jù)這幾種狀態(tài)來控制布局控件的改變了:

 @Override  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    if (holder instanceof MyViewHolder) {      ((MyViewHolder) holder).mTextView.setText(mList.get(position));    } else if (holder instanceof FootViewHolder) {      FootViewHolder footViewHolder = (FootViewHolder) holder;      if (position == 0) {//如果第一個就是腳布局,,那就讓他隱藏        footViewHolder.mProgressBar.setVisibility(View.GONE);        footViewHolder.tv_line1.setVisibility(View.GONE);        footViewHolder.tv_line2.setVisibility(View.GONE);        footViewHolder.tv_state.setText("");      }      switch (footer_state) {//根據(jù)狀態(tài)來讓腳布局發(fā)生改變//        case PULL_LOAD_MORE://上拉加載//          footViewHolder.mProgressBar.setVisibility(View.GONE);//          footViewHolder.tv_state.setText("上拉加載更多");//          break;        case LOADING_MORE:          footViewHolder.mProgressBar.setVisibility(View.VISIBLE);          footViewHolder.tv_line1.setVisibility(View.GONE);          footViewHolder.tv_line2.setVisibility(View.GONE);          footViewHolder.tv_state.setText("正在加載...");          break;        case NO_MORE:          footViewHolder.mProgressBar.setVisibility(View.GONE);          footViewHolder.tv_line1.setVisibility(View.VISIBLE);          footViewHolder.tv_line2.setVisibility(View.VISIBLE);          footViewHolder.tv_state.setText("我是有底線的");          footViewHolder.tv_state.setTextColor(Color.parseColor("#ff00ff"));          break;      }    }  }

不要忘了返回的count也要加1,因為添加了一個腳布局:

 @Override  public int getItemCount() {    return mList != null ? mList.size() + 1 : 0;  }

那么什么時候去傳遞狀態(tài)到adapter呢?這里就需要給RecyclerView添加滑動監(jiān)聽了,當(dāng)他滑動到底部的時候顯示加載中的狀態(tài):

//給recyclerView添加滑動監(jiān)聽    mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {      @Override      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {        super.onScrollStateChanged(recyclerView, newState);        /*        到達(dá)底部了,如果不加!isLoading的話到達(dá)底部如果還一滑動的話就會一直進入這個方法        就一直去做請求網(wǎng)絡(luò)的操作,這樣的用戶體驗肯定不好.添加一個判斷,每次滑倒底只進行一次網(wǎng)絡(luò)請求去請求數(shù)據(jù)        當(dāng)請求完成后,在把isLoading賦值為false,下次滑倒底又能進入這個方法了         */        if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount() && !isLoading) {          //到達(dá)底部之后如果footView的狀態(tài)不是正在加載的狀態(tài),就將 他切換成正在加載的狀態(tài)          if (page < totlePage) {            Log.e("duanlian", "onScrollStateChanged: " + "進來了");            isLoading = true;            mAdapter.changeState(1);            new Handler().postDelayed(new Runnable() {              @Override              public void run() {                getData();                page++;              }            }, 2000);          } else {            mAdapter.changeState(2);          }        }      }      @Override      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {        super.onScrolled(recyclerView, dx, dy);        //拿到最后一個出現(xiàn)的item的位置        lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();      }    });

重點就這幾個,下面給出腳布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:id="@+id/ll_below"        android:layout_width="match_parent"        android:layout_height="45dp"  >  <LinearLayout    android:layout_width="fill_parent"    android:layout_height="45dp"    android:gravity="center"    android:orientation="horizontal">    <TextView      android:id="@+id/tv_line1"      android:layout_width="60dp"      android:layout_height="1dp"      android:layout_marginRight="10dp"      android:background="#ff00ff"      android:visibility="gone"/>    <ProgressBar      android:id="@+id/progressbar"      android:layout_width="25dp"      android:layout_height="25dp"      android:visibility="visible"/>    <TextView      android:id="@+id/foot_view_item_tv"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_marginLeft="4dp"      android:text="上拉加載更多"/>    <TextView      android:id="@+id/tv_line2"      android:layout_width="60dp"      android:layout_height="1dp"      android:layout_marginLeft="10dp"      android:background="#ff00ff"      android:visibility="gone"/>  </LinearLayout></RelativeLayout>

Adapter的代碼:

package com.duanlian.recyclerviewloadmoredemo;import android.content.Context;import android.graphics.Color;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.TextView;import java.util.List;public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {  private Context mContext;  private List<String> mList;  //普通布局的type  static final int TYPE_ITEM = 0;  //腳布局  static final int TYPE_FOOTER = 1;  //  //上拉加載更多//  static final int PULL_LOAD_MORE = 0;  //正在加載更多  static final int LOADING_MORE = 1;  //沒有更多  static final int NO_MORE = 2;  //腳布局當(dāng)前的狀態(tài),默認(rèn)為沒有更多  int footer_state = 1;  public MyRecyclerAdapter(Context context, List<String> list) {    mContext = context;    mList = list;  }  @Override  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    if (viewType == TYPE_ITEM) {      View view = View.inflate(mContext, R.layout.item_recycler, null);      MyViewHolder holder = new MyViewHolder(view);      return holder;    } else if (viewType == TYPE_FOOTER) {      //腳布局      View view = View.inflate(mContext, R.layout.recycler_load_more_layout, null);      FootViewHolder footViewHolder = new FootViewHolder(view);      return footViewHolder;    }    return null;  }  @Override  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    if (holder instanceof MyViewHolder) {      ((MyViewHolder) holder).mTextView.setText(mList.get(position));    } else if (holder instanceof FootViewHolder) {      FootViewHolder footViewHolder = (FootViewHolder) holder;      if (position == 0) {//如果第一個就是腳布局,,那就讓他隱藏        footViewHolder.mProgressBar.setVisibility(View.GONE);        footViewHolder.tv_line1.setVisibility(View.GONE);        footViewHolder.tv_line2.setVisibility(View.GONE);        footViewHolder.tv_state.setText("");      }      switch (footer_state) {//根據(jù)狀態(tài)來讓腳布局發(fā)生改變//        case PULL_LOAD_MORE://上拉加載//          footViewHolder.mProgressBar.setVisibility(View.GONE);//          footViewHolder.tv_state.setText("上拉加載更多");//          break;        case LOADING_MORE:          footViewHolder.mProgressBar.setVisibility(View.VISIBLE);          footViewHolder.tv_line1.setVisibility(View.GONE);          footViewHolder.tv_line2.setVisibility(View.GONE);          footViewHolder.tv_state.setText("正在加載...");          break;        case NO_MORE:          footViewHolder.mProgressBar.setVisibility(View.GONE);          footViewHolder.tv_line1.setVisibility(View.VISIBLE);          footViewHolder.tv_line2.setVisibility(View.VISIBLE);          footViewHolder.tv_state.setText("我是有底線的");          footViewHolder.tv_state.setTextColor(Color.parseColor("#ff00ff"));          break;      }    }  }  @Override  public int getItemViewType(int position) {    //如果position加1正好等于所有item的總和,說明是最后一個item,將它設(shè)置為腳布局    if (position + 1 == getItemCount()) {      return TYPE_FOOTER;    } else {      return TYPE_ITEM;    }  }  @Override  public int getItemCount() {    return mList != null ? mList.size() + 1 : 0;  }  /**   * 正常布局的ViewHolder   */  class MyViewHolder extends RecyclerView.ViewHolder {    TextView mTextView;    public MyViewHolder(View itemView) {      super(itemView);      mTextView = (TextView) itemView.findViewById(R.id.item_textView);    }  }  /**   * 腳布局的ViewHolder   */  public static class FootViewHolder extends RecyclerView.ViewHolder {    private ProgressBar mProgressBar;    private TextView tv_state;    private TextView tv_line1;    private TextView tv_line2;    public FootViewHolder(View itemView) {      super(itemView);      mProgressBar = (ProgressBar) itemView.findViewById(R.id.progressbar);      tv_state = (TextView) itemView.findViewById(R.id.foot_view_item_tv);      tv_line1 = (TextView) itemView.findViewById(R.id.tv_line1);      tv_line2 = (TextView) itemView.findViewById(R.id.tv_line2);    }  }  /**   * 改變腳布局的狀態(tài)的方法,在activity根據(jù)請求數(shù)據(jù)的狀態(tài)來改變這個狀態(tài)   *   * @param state   */  public void changeState(int state) {    this.footer_state = state;    notifyDataSetChanged();  }}

activity中的代碼:

package com.duanlian.recyclerviewloadmoredemo;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {  private RecyclerView mRecycler;  private List<String> mList;  private List<String> list;  private MyRecyclerAdapter mAdapter;  LinearLayoutManager linearLayoutManager;  int lastVisibleItem;  int page = 0;  boolean isLoading = false;//用來控制進入getdata()的次數(shù)  int totlePage = 5;//模擬請求的一共的頁數(shù)  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    getData();  }  private void initView() {    mRecycler = (RecyclerView) findViewById(R.id.recycler);    linearLayoutManager = new LinearLayoutManager(this);    mRecycler.setLayoutManager(linearLayoutManager);    mList = new ArrayList<>();    mAdapter = new MyRecyclerAdapter(this, mList);    mRecycler.setAdapter(mAdapter);    //給recyclerView添加滑動監(jiān)聽    mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {      @Override      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {        super.onScrollStateChanged(recyclerView, newState);        /*        到達(dá)底部了,如果不加!isLoading的話到達(dá)底部如果還一滑動的話就會一直進入這個方法        就一直去做請求網(wǎng)絡(luò)的操作,這樣的用戶體驗肯定不好.添加一個判斷,每次滑倒底只進行一次網(wǎng)絡(luò)請求去請求數(shù)據(jù)        當(dāng)請求完成后,在把isLoading賦值為false,下次滑倒底又能進入這個方法了         */        if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount() && !isLoading) {          //到達(dá)底部之后如果footView的狀態(tài)不是正在加載的狀態(tài),就將 他切換成正在加載的狀態(tài)          if (page < totlePage) {            Log.e("duanlian", "onScrollStateChanged: " + "進來了");            isLoading = true;            mAdapter.changeState(1);            new Handler().postDelayed(new Runnable() {              @Override              public void run() {                getData();                page++;              }            }, 2000);          } else {            mAdapter.changeState(2);          }        }      }      @Override      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {        super.onScrolled(recyclerView, dx, dy);        //拿到最后一個出現(xiàn)的item的位置        lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();      }    });  }  /**   * 模擬請求數(shù)據(jù)   */  private void getData() {    list = new ArrayList<>();    for (int i = 0; i < 10; i++) {      list.add("第" + i + "條");    }    mList.addAll(list);    isLoading = false;    mAdapter = new MyRecyclerAdapter(this, mList);    mRecycler.setAdapter(mAdapter);  }}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 美姑县| 彝良县| 揭阳市| 雅江县| 通化县| 乐陵市| 江西省| 蒙山县| 青冈县| 望都县| 库尔勒市| 牙克石市| 隆尧县| 咸丰县| 海伦市| 象山县| 时尚| 建瓯市| 休宁县| 舟山市| 马公市| 佛学| 垣曲县| 张家港市| 湄潭县| 项城市| 屏山县| 华亭县| 湘阴县| 濉溪县| 渑池县| 金川县| 灯塔市| 韶山市| 石狮市| 乡宁县| 安达市| 封丘县| 巴东县| 聊城市| 怀仁县|