【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )
文章目錄
- 一、增加單條數據
- 二、增加多條數據
- 三、完整代碼示例
- 四、RecyclerView 相關資料
一、增加單條數據
增加單條數據 : 調用 RecyclerView.Adapter 的 void notifyItemInserted(int position) 方法 , 傳入的參數是被插入的元素的當前索引 ;
該方法的作用是通知任何被注冊的觀察者 , 該 item 元素的 position 位置是被新插入的 ;
該位置之前的元素目前在 position + 1 位置 ;
int position 參數 : 最新插入的元素在數據集中的位置 ;
注意 : 調用該方法后 , 只會刷新與該位置相關的 item 元素 , 不會刷新其它元素 , 即使數據改變了 , 也不會刷新 ;
代碼示例 : 在集合的開始位置插入一個元素 ;
// 在集合開始添加一個元素names.add(0, "戴宗");// 通知適配器新元素添加adapter.notifyItemInserted(0);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 元素的 position 位置是被新插入的 ; * 該位置之前的元素目前在 position + 1 位置 ; ** 這是一個結構性的變化事件 ; * 表示在數據集中的其它元素仍然被認為是最新的數據 , 這些數據不會被重新綁定 , * 盡管它們的位置已經發生了變化 ;** @param position 最新插入的元素在新的數據集中的位置 ;** @see #notifyItemRangeInserted(int, int)*/public final void notifyItemInserted(int position) {mObservable.notifyItemRangeInserted(position, 1);}} }運行效果 : 動畫效果是系統自帶的 , 可以自己實現 ;
二、增加多條數據
增加單條數據 : 調用 RecyclerView.Adapter 的 void notifyItemRangeInserted(int positionStart, int itemCount) 方法 , 傳入的參數是被插入的元素的首個索引 , 以及插入元素的個數 ;
通知任何被注冊的觀察者 , 從 positionStart 位置開始的 itemCount 個 item 元素是被新插入的 ;
被插入數據之前 positionStart 位置的元素目前在 positionStart + itemCount 位置 ;
參數說明 :
int positionStart 參數 : 新插入的首個元素位置 ;
int itemCount 參數 : 新插入元素的個數 ;
代碼示例 : 在集合的開始位置插入三個元素 ;
// 在集合開始添加多個元素names.add(0, "戴宗");names.add(0, "劉唐");names.add(0, "李逵");// 通知適配器多個新元素添加adapter.notifyItemRangeInserted(0, 3);RecyclerView.Adapter.notifyItemInserted(int position) 函數原型 : 該函數定義在 RecyclerView 的內部類 Adapter 中 ;
public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {public abstract static class Adapter<VH extends ViewHolder> {/*** 通知任何被注冊的觀察者 , 從 positionStart 位置開始的 itemCount 個 item 元素是被新插入的 ; * 被插入數據之前 positionStart 位置的元素目前在 positionStart + itemCount 位置 ;** 這是一個結構性的變化事件 ; * 表示在數據集中的其它元素仍然被認為是最新的數據 , 這些數據不會被重新綁定 , * 盡管它們的位置已經發生了變化 ;** @param positionStart 被插入的首個元素位置 ;* @param itemCount 被插入元素個數 ;** @see #notifyItemInserted(int)*/public final void notifyItemRangeInserted(int positionStart, int itemCount) {mObservable.notifyItemRangeInserted(positionStart, itemCount);}} }運行效果 : 動畫效果是系統自帶的 , 可以自己實現 ;
三、完整代碼示例
完整代碼示例 僅做參考 :
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);}});}/*** 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 数据更新 ( 增加单条数据 | 批量增加数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Cubase】Cubase 量化设置
- 下一篇: 【RecyclerView】 十一、Re