最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android RecyclerView的刷新分頁的實現(xiàn)

 更新時間:2018年05月20日 15:09:14   作者:零點小筑  
這篇文章主要介紹了Android RecyclerView的刷新分頁的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在開發(fā)中常常使用到刷新分頁,這里實現(xiàn)一個 RecyclerView 的簡單的刷新分頁操作,測試效果見文末,實現(xiàn)過程參考如下:

實現(xiàn)思路

  1. 加載更多數(shù)據(jù)使用到 RecyclerView 加載多種布局,根據(jù) ViewType 判斷加載數(shù)據(jù) Item 還是加載 FooterItem ;
  2. 通過線程模擬加載數(shù)據(jù);
  3. 為 RecyclerView 添加 addOnScrollListener 事件來監(jiān)聽用戶的滑動操作;
  4. 根據(jù)用戶滑動狀態(tài)以及具體情況開始加載數(shù)據(jù)
  5. 通知數(shù)據(jù)更新;

如何獲得 firstVisibleItemPosition

為了能夠在數(shù)據(jù)加載中動態(tài)判斷什么時候加載數(shù)據(jù),需要知道屏幕上顯示的第一個可見的 Item 的位置,當然了這里使用的是布局管理器是 LinearLayoutManager ,這樣查找屏幕上第一個可見的 Item 就顯得容易多了,下面介紹一些 LinearLayoutManager 的四個方法:

findFirstVisibleItemPosition()

獲得屏幕上第一個可見 Item 的 position,只要該 Item 有一部分可見,那么返回的 position 就是該Item 的 position。

findFirstCompletelyVisibleItemPosition()

獲得屏幕上第一個完整可見的 Item 的 position,只要該 Item 有一部分不可見,那么返回的 position 就是該 Item 對應的下一個能顯示完整的 Item 的position。

findLastVisibleItemPosition()

獲得屏幕上最后一個可見 Item 的 position,只要該 Item 有一部分可見,那么返回的 position 就是該Item 的 position。

findLastCompletelyVisibleItemPosition()

獲得屏幕上最后一個完整可見的 Item 的 position,只要該 Item 有一部分不可見,那么返回的 position 就是該 Item 對應的上一個能顯示完整的 Item 的position。

準備數(shù)據(jù)

/**
  * 初始化數(shù)據(jù)
  * @return
  */
 public void initData(){
  for (int i=0;i<30;i++){
   arrayList.add("第"+i+"條數(shù)據(jù)");
  }
 }
 
 /**
  * 線程模擬加載數(shù)據(jù)
  */
 class LoadDataThread extends Thread{
  @Override
  public void run() {
   initData();
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   //通知主線程更新數(shù)據(jù)
   Message message = handler.obtainMessage();
   message.what = UPDATE_DATA;
   message.obj = arrayList;
   handler.sendMessage(message);
  }
 }

代碼參考

主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 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.manu.mrecyclerview.MainActivity">
 <android.support.v7.widget.RecyclerView
  android:id="@+id/rv"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
 </android.support.v7.widget.RecyclerView>
</LinearLayout>

Item布局

/**item.xml**/
<?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="match_parent"
 android:padding="5dp">
 <TextView
  android:id="@+id/tv_recycle"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center_horizontal"
  android:text="data"
  android:background="#cac3c3"
  android:padding="10dp"
  android:textSize="20sp"/>
</LinearLayout>
/**item_footer.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_height="match_parent"
 android:gravity="center_horizontal">
 <ProgressBar
  style="?android:attr/progressBarStyleSmall"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@+id/progressBar" />
 <TextView
  android:text="正在努力加載中,請稍后..."
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@+id/textView" />
</LinearLayout>

Adapter

這里使用了 RecyclerView 根據(jù)不同的 ViewType 加載多種布局的用法,使用時根據(jù)不同的布局創(chuàng)建不同的 ViewHolder , 然后根據(jù)不同的 Viewholder 為對應的 Item 添加數(shù)據(jù),注意 getItemViewType() 方法的用法,Adapter 代碼參考如下:

/**
 * Created by jzman on 2017/6/04
 * RecycleView的Adapter
 */
public class RvAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements
  View.OnClickListener{
 private static final int ITEM_FOOTER = 0x1;
 private static final int ITEM_DATA = 0x2;
 private Context mContext;
 private RecyclerView recyclerView;
 private ArrayList<String> mList;

 public RvAdapter1() {}

 public RvAdapter1(Context mContext, ArrayList<String> mList) {
  this.mContext = mContext;
  this.mList = mList;
 }

 public void setmList(ArrayList<String> mList) {
  this.mList = mList;
 }

 /**
  * 用于創(chuàng)建ViewHolder
  * @param parent
  * @param viewTypez
  * @return
  */
 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view ;
  RecyclerView.ViewHolder vh = null;
  switch (viewType){
   case ITEM_DATA:
    view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
    view.setOnClickListener(this);
    vh = new DataViewHolder(view);
    //使用代碼設置寬高(xml布局設置無效時)
    view.setLayoutParams(new ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT));
    break;
   case ITEM_FOOTER:
    view = LayoutInflater.from(mContext).inflate(R.layout.item_footer,null);
    //使用代碼設置寬高(xml布局設置無效時)
    vh = new FooterViewHolder(view);
    view.setLayoutParams(new ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT));
    break;
  }
  return vh;
 }

 /**
  * 獲取Item的View類型
  * @param position
  * @return
  */
 @Override
 public int getItemViewType(int position) {
  //根據(jù) Item 的 position 返回不同的 Viewtype
  if (position == (getItemCount())-1){
   return ITEM_FOOTER;
  }else{
   return ITEM_DATA;
  }
 }

 /**
  * 綁定數(shù)據(jù)
  * @param holder
  * @param position
  */
 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  if (holder instanceof DataViewHolder){
   DataViewHolder dataViewHolder = (DataViewHolder) holder;
   dataViewHolder.tv_data.setText(mList.get(position));
  }else if (holder instanceof FooterViewHolder){

  }
 }

 /**
  * 選項總數(shù)
  * @return
  */
 @Override
 public int getItemCount() {
  return mList.size()+1;
 }

 @Override
 public void onClick(View view) {
  //根據(jù)RecyclerView獲得當前View的位置
  int position = recyclerView.getChildAdapterPosition(view);
  //程序執(zhí)行到此,會去執(zhí)行具體實現(xiàn)的onItemClick()方法
  if (onItemClickListener!=null){
   onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
  }
 }

 /**
  * 創(chuàng)建ViewHolder
  */
 public static class DataViewHolder extends RecyclerView.ViewHolder{
  TextView tv_data;
  public DataViewHolder(View itemView) {
   super(itemView);
   tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
  }
 }

 /**
  * 創(chuàng)建footer的ViewHolder
  */
 public static class FooterViewHolder extends RecyclerView.ViewHolder{
  public FooterViewHolder(View itemView) {
   super(itemView);
  }
 }

 private OnItemClickListener onItemClickListener;
 public void setOnItemClickListener(OnItemClickListener onItemClickListener){
  this.onItemClickListener = onItemClickListener;
 }

 /**
  * 定義RecyclerView選項單擊事件的回調接口
  */
 public interface OnItemClickListener{
  //參數(shù)(父組件,當前單擊的View,單擊的View的位置,數(shù)據(jù))
  void onItemClick(RecyclerView parent,View view, int position, String data);
 }
 /**
  * 將RecycleView附加到Adapter上
  */
 @Override
 public void onAttachedToRecyclerView(RecyclerView recyclerView) {
  super.onAttachedToRecyclerView(recyclerView);
  this.recyclerView= recyclerView;
 }
 /**
  * 將RecycleView從Adapter解除
  */
 @Override
 public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
  super.onDetachedFromRecyclerView(recyclerView);
  this.recyclerView = null;
 }
}

MainActivity

這里主要注意 rv.addOnScrollListener(new OnScrollListener() ...里面的具體實現(xiàn),MainActivity 代碼參考如下:

/**
 * Created by jzman on 2017/6/04 0013.
 */
public class MainActivity extends AppCompatActivity {
 private static final int UPDATE_DATA = 0x3;
 
 private RecyclerView rv;
 RvAdapter1 adapter;

 private ArrayList<String> arrayList = new ArrayList<>();
 //加載更多數(shù)據(jù)時最后一項的索引
 private int lastLoadDataItemPosition;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  rv = (RecyclerView) findViewById(R.id.rv);

  //設置布局管理器
  rv.setLayoutManager(new LinearLayoutManager(this));//線性
//  rv.setLayoutManager(new GridLayoutManager(this,4));//線性
//  rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//線性
  initData();
  adapter = new RvAdapter1(this,arrayList);
  adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
   @Override
   public void onItemClick(RecyclerView parent, View view, int position, String data) {
    Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
   }
  });

  rv.addOnScrollListener(new OnScrollListener() {
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    if (newState == SCROLL_STATE_IDLE &&
      lastLoadDataItemPosition == adapter.getItemCount()){
     new LoadDataThread().start();
    }
   }

   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

    LayoutManager layoutManager = recyclerView.getLayoutManager();
    if (layoutManager instanceof LinearLayoutManager){
     LinearLayoutManager manager = (LinearLayoutManager) layoutManager;
     int firstVisibleItem = manager.findFirstVisibleItemPosition();
     int l = manager.findLastCompletelyVisibleItemPosition();
     lastLoadDataItemPosition = firstVisibleItem+(l-firstVisibleItem)+1;
    }
   }
  });

  rv.setAdapter(adapter);
 }

 /**
  * 初始化數(shù)據(jù)
  * @return
  */
 public void initData(){
  for (int i=0;i<25;i++){
   arrayList.add("第"+i+"條數(shù)據(jù)");
  }
 }

 /**
  * 線程模擬加載數(shù)據(jù)
  */
 class LoadDataThread extends Thread{
  @Override
  public void run() {
   initData();
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   Message message = handler.obtainMessage();
   message.what = UPDATE_DATA;
   message.obj = arrayList;
   handler.sendMessage(message);
  }
 }

 private Handler handler = new Handler(){

  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what){
    case UPDATE_DATA:
     arrayList = (ArrayList<String>) msg.obj;
     adapter.setmList(arrayList);
     adapter.notifyDataSetChanged();
     break;
   }
  }
 };
}

測試效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android View 事件防抖的兩種方案

    Android View 事件防抖的兩種方案

    這篇文章主要介紹了Android View 事件防抖的兩種方案,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下
    2021-04-04
  • 解析Android 8.1平臺SystemUI 導航欄加載流程

    解析Android 8.1平臺SystemUI 導航欄加載流程

    這篇文章主要介紹了Android 8.1平臺SystemUI 導航欄加載流程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Android開發(fā)應用中Broadcast Receiver組件詳解

    Android開發(fā)應用中Broadcast Receiver組件詳解

    本篇文章主要介紹了Android開發(fā)應用中Broadcast Receiver組件詳解,想要學習的同學可以了解一下。
    2016-11-11
  • Android仿最新微信相機功能

    Android仿最新微信相機功能

    這篇文章主要為大家詳細介紹了Android仿最新微信相機功能,長按拍攝,輕點拍照功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android PowerManagerService省電模式策略控制

    Android PowerManagerService省電模式策略控制

    這篇文章主要介紹了Android PowerManagerService省電模式策略控制,本文基于前兩篇文章的基礎介紹展開詳情,感興趣的小伙伴可以參考一下
    2022-08-08
  • Android實現(xiàn)文字消除效果

    Android實現(xiàn)文字消除效果

    由于項目和語音識別相關,有時候人在不經(jīng)意間交流的無效音頻會被識別出來,并展示于界面,為了美觀,客戶要求我們將這些無效的識別文本用一個從右到左的動畫給清除,于是便有了下述的技術實現(xiàn)。感興趣的朋友可以參考下
    2021-06-06
  • 使用Docker來加速構建Android應用的基本部署思路解析

    使用Docker來加速構建Android應用的基本部署思路解析

    這篇文章主要介紹了使用Docker來加速構建Android應用的部署思路解析,在服務器中通過Docker鏡像來獲得更高效的開發(fā)和測試流程,需要的朋友可以參考下
    2016-01-01
  • Android自定義組件跟隨自己手指主動畫圓

    Android自定義組件跟隨自己手指主動畫圓

    這篇文章主要為大家詳細介紹了Android自定義組件跟隨自己手指主動畫圓,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android開發(fā)flow常見API的使用示例詳解

    Android開發(fā)flow常見API的使用示例詳解

    這篇文章主要為大家介紹了Android開發(fā)flow常見API的使用示例詳解,希望能夠幫助大家更好的掌握flow使用,熟練的應用于各種場景,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android 5.0以上Toast不顯示的解決方法

    Android 5.0以上Toast不顯示的解決方法

    最近在開發(fā)中我們經(jīng)常會在適配5.0以后的機型遇到各種各樣的問題,其中有一個不大不小的問題就是:Toast不顯示問題,這篇文章就給大家總結了Android 5.0以上Toast不顯示的原因與解決方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11

最新評論

霍山县| 沂南县| 襄汾县| 西畴县| 台南市| 广灵县| 林周县| 龙游县| 齐齐哈尔市| 迭部县| 从江县| 铜鼓县| 大安市| 汽车| 昌都县| 上饶县| 睢宁县| 大新县| 大余县| 鹤岗市| 仲巴县| 崇仁县| 老河口市| 阿拉善右旗| 富源县| 天峻县| 江源县| 庆元县| 台安县| 新民市| 宁蒗| 乡宁县| 台湾省| 博湖县| 临潭县| 新河县| 马边| 土默特左旗| 瑞金市| 比如县| 宾川县|