一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android RecyclerView的刷新分頁的實現(xiàn)

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

2022-02-23 15:04零點小筑 Android

這篇文章主要介紹了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ù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
  * 初始化數(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);
  }
 }

代碼參考

主布局

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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布局

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**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>
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**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 代碼參考如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
 * 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選項單擊事件的回調(diào)接口
  */
 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 代碼參考如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
 * 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 RecyclerView的刷新分頁的實現(xiàn)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/9a540babacf0

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产免费一区不卡在线 | 国产综合久久久久 | 超级碰碰青草免费视频92 | 近亲乱中文字幕 | 色偷偷伊人 | 黄+色+性+人免费 | 被黑人同学彻底征服全文小说阅读 | 午夜A级理论片左线播放 | 妇女澡堂淋浴性 | 小兰被扒开内裤露出p | 成在线人免费 | 亚洲午夜久久久久影院 | h片免费网站| 免费看又黄又爽又猛的视频软件- | 亚洲麻豆精品果冻传媒 | 亚州免费一级毛片 | 国产午夜精品久久久久小说 | 亚洲AV蜜桃永久无码精品无码网 | 秀逼逼| 欧美日韩综合网在线观看 | 4438全国免费观看 | 日本免费在线播放 | 大肚孕妇的高h辣文 | 欧美在线视频一区 | 国产福利视频一区二区微拍 | 色欲麻豆国产福利精品 | 精品videoss另类日本 | 俄罗斯图书馆无打码久久 | 精品久久久噜噜噜久久7 | 国产精品久久久久影视不卡 | 91精品啪在线观看国产线免费 | 国产在线精品成人一区二区三区 | 亚洲码在线观看 | 精品国产日韩一区三区 | 国产va欧美va在线观看 | 高h辣h双处全是肉军婚 | 亚洲精品www久久久久久久软件 | 福利姬 magnet | 四虎tv在线观看884aa | 777奇米影视一区二区三区 | 成人福利免费视频 |