日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、移動數據
  • 二、數據改變
  • 三、完整代碼示例
  • 四、RecyclerView 相關資料





一、移動數據



移動數據 : 調用 RecyclerView.Adapter 的 void notifyItemMoved(int fromPosition, int toPosition) 方法 , 傳入的參數是移動前的位置和移動后的位置 ;

該方法的作用是通知任何被注冊的觀察者 , fromPosition 位置的 item 元素移動到了 toPosition 位置 ;


參數說明 :

int fromPosition 參數 : 元素移動前的位置 ;

int toPosition 參數 : 元素移動后的新位置 ;


注意 : 這是一個結構性的變化事件 ;

表示在數據集中的其它元素仍然被認為是最新的數據 , 這些數據不會被重新綁定 , 盡管它們的位置已經發生了變化 ;

也就是說 RecyclerView 只刷新涉及到的 fromPosition 和 toPosition 這 2 個元素 , 其它元素不變 ;


代碼示例 : 先移除第 000 個元素 , 然后在第 777 位置插入相同的數據 , 相當于將第 000 個數據移動到了第 777 位置 ;

// 先移除第 0 個names.remove(0);// 然后在第 7 個位置插入, 此時變為第 7 個元素names.add(7, "宋江");// 通知適配器adapter.notifyItemMoved(0, 7);

RecyclerView.Adapter.notifyItemMoved(int fromPosition, int toPosition) 函數原型 : 該函數定義在 RecyclerView 的內部類 Adapter 中 ;

public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {public abstract static class Adapter<VH extends ViewHolder> {/*** 通知任何被注冊的觀察者 , fromPosition 位置的 item 元素移動到了 toPosition 位置 ;* * 這是一個結構性的變化事件 ; * 表示在數據集中的其它元素仍然被認為是最新的數據 , 這些數據不會被重新綁定 , * 盡管它們的位置已經發生了變化 ;* 也就是說 RecyclerView 只刷新涉及到的 fromPosition 和 toPosition 這 2 個元素 , * 其它元素不變 ; ** @param fromPosition 元素移動前的位置 ;* @param toPosition 元素移動后的新位置 ; */public final void notifyItemMoved(int fromPosition, int toPosition) {mObservable.notifyItemMoved(fromPosition, toPosition);}} }

運行效果 : 動畫效果是系統自帶的 , 可以自己實現 ;





二、數據改變



批量修改數據 : 調用 RecyclerView.Adapter 的 void notifyDataSetChanged( ) 方法 , 通知數據發生了改變 ;

該方法的作用是通知任何被注冊的觀察者 , 數據集發生了改變 ;


調用該方法刷新數據 , 比調用其它方法更有效 , 但是沒有動畫效果 ;


數據改變事件類型 : 有兩種不同的類型 , item 元素改變 和 結構性改變 ;

① item 元素改變 : 指的是單個的 item 的數據更新 , 但是位置沒有改變 ;

② 結構性改變 : 指的是有新的數據被插入 , 刪除 , 移動 , 位置發生了改變 ;


參數說明 :

int positionStart 參數 : 被修改的元素在原數據集中首個元素的位置索引 ;

int itemCount 參數 : 數據集中被修改元素個數 ;


注意 :

該方法不指定數據集發生了哪些變化 , 強制要求任何觀察者對象去呈現所有存在的 item 條目和結構 , 這些數據可能已經失效 ;

布局管理器 LayoutManager 會強制所有數據重新綁定 , 并重新讀取所有可視組件的布局 ;

如果適配器調用了本方法 , 通知數據發生了改變 , RecyclerView 會嘗試去 為適配器 同步可見的結構性改變事件 ;

這樣有助于動畫和可視化對象的持續 , 但是單獨的 item 元素組件需要重新被綁定 ;


代碼示例 : 先移動數據 , 再刪除三個數據 ;

// 先移除第 0 個names.remove(0);// 然后在第 7 個位置插入, 此時變為第 7 個元素names.add(7, "宋江");// 刪除第 0 ~ 2 個元素names.remove(0);names.remove(0);names.remove(0);adapter.notifyDataSetChanged();

RecyclerView.Adapter.notifyItemInserted(int position) 函數原型 : 該函數定義在 RecyclerView 的內部類 Adapter 中 ;

public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {public abstract static class Adapter<VH extends ViewHolder> {/*** 通知任何被注冊的觀察者 , 數據集發生了改變 ; * * 數據改變事件 , 有兩種不同的類型 , item 元素改變 和 結構性改變 ; * item 元素改變時單個的 item 的數據更新 , 但是位置沒有改變 ; * 結構性改變指的是有新的數據被插入 , 刪除 , 移動 , 位置發生了改變 ; * * 該事件不指定數據集發生了哪些變化 , 強制要求任何觀察者對象去呈現所有存在的 item 條目和結構 , 這些數據可能已經失效 ;* 布局管理器 LayoutManager 會強制所有數據重新綁定 , 并重新讀取所有可視組件的布局 ; * * 如果適配器調用了本方法 , 通知數據發生了改變 , RecyclerView 會嘗試去 為適配器 同步可見的結構性改變事件 ; * 這樣有助于動畫和可視化對象的持續 , 但是單獨的 item 元素組件需要重新被綁定 ; * * 如果你正在寫一個適配器 , 使用該方法 , 比使用多個指定的變化方法 , 更加有效 ;** @see #notifyItemChanged(int)* @see #notifyItemInserted(int)* @see #notifyItemRemoved(int)* @see #notifyItemRangeChanged(int, int)* @see #notifyItemRangeInserted(int, int)* @see #notifyItemRangeRemoved(int, int)*/public final void notifyDataSetChanged() {mObservable.notifyChanged();}} }

運行效果 : 該操作沒有動畫效果 , 只是刷新數據顯示 ;





三、完整代碼示例



完整代碼示例 僅做參考 :

package kim.hsl.recyclerview;import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {/*** 數據源*/private ArrayList<String> names = new ArrayList<String>();/*** 適配器*/private Adapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化數據initData();//1 . 從布局中獲取 RecyclerViewRecyclerView recycler_view = findViewById(R.id.recycler_view);//2 . 創建并設置布局管理器//創建布局管理器StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,RecyclerView.VERTICAL);//設置布局管理器recycler_view.setLayoutManager(layoutManager);// 設置邊距recycler_view.addItemDecoration(new ItemDecoration());//3 . 創建并設置列表適配器adapter = new Adapter();recycler_view.setAdapter(adapter);// 初始化點擊事件initClick();}/*** 初始化數據*/private void initData(){names.add("宋江");names.add("盧俊義");names.add("吳用");names.add("公孫勝");names.add("關勝");names.add("林沖");names.add("秦明");names.add("呼延灼");names.add("花榮");names.add("柴進");names.add("李應");names.add("朱仝");names.add("魯智深");names.add("武松");names.add("董平");names.add("張清");names.add("楊志");names.add("徐寧");names.add("索超");}void initClick(){// 增加單個數據findViewById(R.id.insert_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在集合開始添加一個元素names.add(0, "戴宗");// 通知適配器新元素添加adapter.notifyItemInserted(0);}});// 增加多個數據findViewById(R.id.insert_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在集合開始添加多個元素names.add(0, "戴宗");names.add(0, "劉唐");names.add(0, "李逵");// 通知適配器多個新元素添加adapter.notifyItemRangeInserted(0, 3);}});// 刪除單個數據findViewById(R.id.delete_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 刪除第 0 個元素names.remove(0);// 通知適配器adapter.notifyItemRemoved(0);}});// 刪除多個數據findViewById(R.id.delete_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 刪除第 0 ~ 2 個元素names.remove(0);names.remove(0);names.remove(0);// 通知適配器adapter.notifyItemRangeRemoved(0, 3);}});// 修改單個數據findViewById(R.id.modify_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 替換第 0 個元素names.set(0, "宋江江");// 通知適配器adapter.notifyItemChanged(0);}});// 修改多個數據findViewById(R.id.modify_multi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 替換第 0, 1, 2 個元素names.set(0, "宋江江");names.set(1, "盧俊俊");names.set(2, "吳用用");// 通知適配器adapter.notifyItemRangeChanged(0, 3);}});// 移動數據findViewById(R.id.move_single).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 先移除第 0 個names.remove(0);// 然后在第 7 個位置插入, 此時變為第 7 個元素names.add(7, "宋江");// 通知適配器adapter.notifyItemMoved(0, 7);}});// 數據改變findViewById(R.id.data_change).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 先移除第 0 個names.remove(0);// 然后在第 7 個位置插入, 此時變為第 7 個元素names.add(7, "宋江");// 刪除第 0 ~ 2 個元素names.remove(0);names.remove(0);names.remove(0);adapter.notifyDataSetChanged();}});}/*** RecyclerView 適配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + names.get(position));}@Overridepublic int getItemCount() {return names.size();}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}



四、RecyclerView 相關資料



官方文檔 :

使用 RecyclerView 創建動態列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview

高級 RecyclerView 自定義 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom

RecyclerView 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView

RecyclerView.Adapter 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.Adapter

RecyclerView.ViewHolder 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder

RecyclerView.ItemDecoration 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration


代碼示例 :

GitHub 源碼地址 : https://github.com/han1202012/001_RecyclerView

博客源碼快照 : https://download.csdn.net/download/han1202012/14984775

( 使用 Android Studio 打開 )

總結

以上是生活随笔為你收集整理的【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。