机电网站模板,设计师免费资源导航,ppt制作模板免费,福建住建设厅官方网站不尝世间醋与墨#xff0c;怎知人间酸与苦。
择一业谋食养命#xff0c;等一运扭转乾坤。
你见过哪些令你膛目结舌的代码技巧#xff1f; 文章目录 不尝世间醋与墨#xff0c;怎知人间酸与苦。择一业谋食养命#xff0c;等一运扭转乾坤。你见过哪些令你膛目结舌的代码技…不尝世间醋与墨怎知人间酸与苦。
择一业谋食养命等一运扭转乾坤。
你见过哪些令你膛目结舌的代码技巧 文章目录 不尝世间醋与墨怎知人间酸与苦。择一业谋食养命等一运扭转乾坤。你见过哪些令你膛目结舌的代码技巧 一定义二优点三角色四PositionalDataSource来源的使用1添加依赖2创建bean类3创建PositionalDataSource来源的数据源4创建数据工厂5创建ViewModel6创建adapter7,运行效果 五ItemKeyedDataSource来源的使用1创建数据仓库2创建ItemKeyedDataSource3创建YuanZhenDataSourceFactory 六PageKeyedDataSource来源的使用1创建PageKeyedDataSource2创建数据工厂 一定义
在我们的 Android 项目中使用 RecyclerViews 时我们会显示一个包含很多项目的列表。有时我们有一些用例比如从手机中获取联系人列表并将其显示在列表中。在列表中一次加载大量数据并不是一项非常有效的任务。为了克服这个问题我们在 Android 中进行了分页。 Paging就是google为了分页而推出的一个库。Paging库可以帮助您一次加载和显示多个小的数据块按需载入部分数据可以减少网络宽带和系统资源的使用量。
二优点 ①分页库可以更加轻松地在应用程序中的Recyclerview逐步和优雅的加载数据 ②数据请求消耗的网络带宽更少系统资源更少 ③即使在数据更新和刷新期间应用程序仍会继续快速响应用户输入 ④不过多浪费显示多少就用多少 三角色
①DataSource数据源包含了多种形式例如Room来源PositionalDataSource来源PageKeyedDataSource来源ItemKeyedDataSource来源 数据源就是数据的来源可以有多种来源渠道例如“网络数据”“本地数据”“数据库数据”
②PagedListUIModel数据层通过Factory的方式拿到数据源 创建 管理 数据源 的工厂为什么有一个工厂除了可以去创建数据源之外为了后续的扩展
③PagedAdapter不再是之前使用RecycleView的那种适配器了而是和Paging配套的PagedListAdapter 数据模型其实就是 ViewModel用来管理数据 PagedList: 数据源获取的数据最终靠PagedList来承载。 对于PagedList,我们可以这样来理解它就是一页数据的集合。 每请求一页就是新的一个PagedList对象。
④RecycleView我们之前一直用的RecycleView只不过setAdapter的时候绑定的适配器是 PagedAdapter 这个Adapter就是一个RecyclerView的Adapter。 不过我们在使用paging实现RecyclerView的分页加载效果 不能直接继承RecyclerView的Adapter而是需要继承PagedListAdapter。 LiveData观察到的数据把感应到的数据 给 适配器适配器又绑定了 RecyclerView那么RecyclerView的列表数据就改变了
四PositionalDataSource来源的使用
1添加依赖
implementation androidx.paging:paging-runtime:2.1.02创建bean类
public class YuanZhen {private String id;private String name;private String age;public void setId(String id) {this.id id;}public String getId() {return id;}public void setName(String name) {this.name name;}public void setAge(String age) {this.age age;}public String getName() {return name;}public String getAge() {return age;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;YuanZhen student (YuanZhen) o;return id.equals(student.id) name.equals(student.name) age.equals(student.age);}// 比较的函数RequiresApi(api Build.VERSION_CODES.KITKAT)Overridepublic int hashCode() {return Objects.hash(id, name, age);}
}3创建PositionalDataSource来源的数据源
public class YuanZhenDataSource extends PositionalDataSourceYuanZhen {/*** 加载第一页数据的时候会执行此函数来完成* 加载初始化数据加载的是第一页的数据。* 形象的说当我们第一次打开页面需要回调此方法来获取数据。*/Overridepublic void loadInitial(NonNull LoadInitialParams params, NonNull LoadInitialCallbackYuanZhen callback) {callback.onResult(getStudents(0, 20), 0, 1000);}/*** 当有了初始化数据之后滑动的时候如果需要加载数据的话会调用此方法。*/Overridepublic void loadRange(NonNull LoadRangeParams params, NonNull LoadRangeCallbackYuanZhen callback) {callback.onResult(getStudents(params.startPosition, params.loadSize));}/*** 数据源数据的来源数据库文件网络服务器响应 等等*/private ListYuanZhen getStudents(int startPosition, int pageSize) {ListYuanZhen list new ArrayList();for (int i startPosition; i startPosition pageSize; i) {YuanZhen yuanZhen new YuanZhen();yuanZhen.setName(袁震: i);yuanZhen.setAge(年龄: i);list.add(yuanZhen);}return list;}
}4创建数据工厂
public class YuanZhenDataSourceFactory extends DataSource.FactoryInteger,YuanZhen {NonNullOverridepublic DataSourceInteger, YuanZhen create() {YuanZhenDataSource yuanZhenDataSource new YuanZhenDataSource();return yuanZhenDataSource;}
}5创建ViewModel
public class YuanZhenViewModel extends ViewModel {private final LiveDataPagedListYuanZhen listLiveData;public YuanZhenViewModel() {YuanZhenDataSourceFactory factory new YuanZhenDataSourceFactory();// 初始化 ViewModelthis.listLiveData new LivePagedListBuilderInteger, YuanZhen(factory, 20).build();}public LiveDataPagedListYuanZhen getListLiveData() {return listLiveData;}
}6创建adapter
public class RecyclerPagingAdapter extends PagedListAdapterYuanZhen,RecyclerPagingAdapter.MyRecyclerViewHolder {private static DiffUtil.ItemCallbackYuanZhen DIFF_STUDNET newDiffUtil.ItemCallbackYuanZhen() {// 一般是比较 唯一性的内容 IDOverridepublic boolean areItemsTheSame(NonNull YuanZhen oldItem, NonNull YuanZhen newItem) {return oldItem.getId().equals(newItem.getId());}// 对象本身的比较Overridepublic boolean areContentsTheSame(NonNull YuanZhen oldItem, NonNull YuanZhen newItem) {return oldItem.equals(newItem);}};protected RecyclerPagingAdapter() {super(DIFF_STUDNET);}NonNullOverridepublic MyRecyclerViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {View view LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);return new MyRecyclerViewHolder(view);}Overridepublic void onBindViewHolder(NonNull MyRecyclerViewHolder holder, int position) {YuanZhen yuanzhen getItem(position);// item view 出来了 分页库还在加载数据中我就显示 Id加载中if (null yuanzhen) {holder.tvName.setText(Name加载中);holder.tvAge.setText(age加载中);} else {holder.tvName.setText(yuanzhen.getName());holder.tvAge.setText(yuanzhen.getAge());}}// Item 优化的 ViewHolderpublic static class MyRecyclerViewHolder extends RecyclerView.ViewHolder {TextView tvId;TextView tvName;TextView tvAge;public MyRecyclerViewHolder(View itemView) {super(itemView);tvName itemView.findViewById(R.id.tv_name); // 名称tvAge itemView.findViewById(R.id.tv_age); // 性别}}
}item
?xml version1.0 encodingutf-8?
LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationhorizontalandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentTextViewandroid:idid/tv_nameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textSize20dpandroid:layout_weight1android:gravitycenterandroid:layout_marginLeft5dp/TextViewandroid:idid/tv_ageandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textSize20dpandroid:textColorandroid:color/blackandroid:layout_weight1android:gravitycenterandroid:layout_marginLeft5dp//LinearLayout7使用
public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;RecyclerPagingAdapter recyclerPagingAdapter;YuanZhenViewModel viewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView findViewById(R.id.recycle_view);recyclerPagingAdapter new RecyclerPagingAdapter();viewModel new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(YuanZhenViewModel.class);// LiveData 观察者 感应更新viewModel.getListLiveData().observe(this, new ObserverPagedListYuanZhen() {Overridepublic void onChanged(PagedListYuanZhen students) {// 再这里更新适配器数据recyclerPagingAdapter.submitList(students);}});recyclerView.setAdapter(recyclerPagingAdapter);recyclerView.setLayoutManager(new LinearLayoutManager(this));}
}?xml version1.0 encodingutf-8?
LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityandroid:orientationverticalandroidx.recyclerview.widget.RecyclerViewandroid:idid/recycle_viewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent //LinearLayout7,运行效果 五ItemKeyedDataSource来源的使用
1创建数据仓库
public class DataRepository {private ListYuanZhen dataList new ArrayList();public DataRepository() {for (int i 0; i 1000; i) {YuanZhen person new YuanZhen();person.setName(袁震: i);person.setAge(年龄: i);dataList.add(person);}}public ListYuanZhen initData(int size) {return dataList.subList(0, size);}public ListYuanZhen loadPageData(int page, int size) {int totalPage;if (dataList.size() % size 0) {totalPage dataList.size() / size;} else {totalPage dataList.size() / size 1;}if (page totalPage || page 1) {return null;}if (page totalPage) {return dataList.subList((page - 1) * size, dataList.size());}return dataList.subList((page - 1) * size, page * size);}
}2创建ItemKeyedDataSource
public class CustomItemDataSource extends ItemKeyedDataSourceInteger, YuanZhen {private DataRepository dataRepository;CustomItemDataSource(DataRepository dataRepository) {this.dataRepository dataRepository;}// loadInitial 初始加载数据Overridepublic void loadInitial(NonNull LoadInitialParamsInteger params, NonNull LoadInitialCallbackYuanZhen callback) {ListYuanZhen dataList dataRepository.initData(params.requestedLoadSize);callback.onResult(dataList);}NonNullOverridepublic Integer getKey(NonNull YuanZhen item) {return (int) System.currentTimeMillis();}// loadBefore 向前分页加载数据Overridepublic void loadBefore(NonNull LoadParamsInteger params, NonNull LoadCallbackYuanZhen callback) {ListYuanZhen dataList dataRepository.loadPageData(params.key, params.requestedLoadSize);if (dataList ! null) {callback.onResult(dataList);}}// loadAfter 向后分页加载数据Overridepublic void loadAfter(NonNull LoadParamsInteger params, NonNull LoadCallbackYuanZhen callback) {ListYuanZhen dataList dataRepository.loadPageData(params.key, params.requestedLoadSize);if (dataList ! null) {callback.onResult(dataList);}}}3创建YuanZhenDataSourceFactory
public class YuanZhenDataSourceFactory extends DataSource.FactoryInteger,YuanZhen {NonNullOverridepublic DataSourceInteger, YuanZhen create() {return new CustomItemDataSource(new DataRepository());}
}六PageKeyedDataSource来源的使用
1创建PageKeyedDataSource
public class CustomPageDataSource extends PageKeyedDataSourceInteger, YuanZhen {private DataRepository dataRepository;CustomPageDataSource(DataRepository dataRepository) {this.dataRepository dataRepository;}// loadInitial 初始加载数据Overridepublic void loadInitial(NonNull LoadInitialParamsInteger params, NonNull LoadInitialCallbackInteger, YuanZhen callback) {ListYuanZhen dataList dataRepository.initData(params.requestedLoadSize);callback.onResult(dataList, null, 2);}// loadBefore 向前分页加载数据Overridepublic void loadBefore(NonNull LoadParamsInteger params, NonNull LoadCallbackInteger, YuanZhen callback) {ListYuanZhen dataList dataRepository.loadPageData(params.key, params.requestedLoadSize);if (dataList ! null) {callback.onResult(dataList, params.key - 1);}}// loadAfter 向后分页加载数据Overridepublic void loadAfter(NonNull LoadParamsInteger params, NonNull LoadCallbackInteger, YuanZhen callback) {ListYuanZhen dataList dataRepository.loadPageData(params.key, params.requestedLoadSize);if (dataList ! null) {callback.onResult(dataList, params.key 1);}}
}2创建数据工厂
public class YuanZhenDataSourceFactory extends DataSource.FactoryInteger,YuanZhen {NonNullOverridepublic DataSourceInteger, YuanZhen create() {return new CustomPageDataSource(new DataRepository());}
}