- MutableItemKeyedDataSource 管理數據源
@SuppressLint("RestrictedApi")
public abstract class MutableItemKeyedDataSource<Key, Value> extends ItemKeyedDataSource<Key, Value> {
private ItemKeyedDataSource mDataSource;
public List<Value> data = new ArrayList<>();
public PagedList<Value> buildNewPagedList(PagedList.Config config) {
PagedList<Value> pagedList = new PagedList.Builder<Key, Value>(this, config)
.setFetchExecutor(ArchTaskExecutor.getIOThreadExecutor())
.setNotifyExecutor(ArchTaskExecutor.getMainThreadExecutor())
.build();
return pagedList;
}
public MutableItemKeyedDataSource(ItemKeyedDataSource dataSource) {
mDataSource = dataSource;
}
@Override
public void loadInitial(@NonNull LoadInitialParams<Key> params, @NonNull LoadInitialCallback<Value> callback) {
callback.onResult(data);
}
@Override
public void loadAfter(@NonNull LoadParams<Key> params, @NonNull LoadCallback<Value> callback) {
if (mDataSource != null) {
mDataSource.loadAfter(params, callback);
}
}
@Override
public void loadBefore(@NonNull LoadParams<Key> params, @NonNull LoadCallback<Value> callback) {
callback.onResult(Collections.emptyList());
}
@NonNull
@Override
public abstract Key getKey(@NonNull Value item);
}
public void addAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
dataSource.data.add(item);
dataSource.data.addAll(currentList.snapshot());
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public void deleteAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
for (Teacher.RecordsBean recordsBean : currentList.snapshot()) {
if (recordsBean != item) {
dataSource.data.add(recordsBean);
}
}
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public void upDateAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
for (Teacher.RecordsBean recordsBean : currentList.snapshot()) {
if (recordsBean == item) {
recordsBean.setPaintingName("我是修改的:" + recordsBean.getPaintingName());
}
}
dataSource.data.addAll(currentList);
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
List<Teacher.RecordsBean> lists = adapter.getCurrentList().snapshot();
for (Teacher.RecordsBean list : lists) {
Log.e("TTT", list.getPaintingId()+""+list.getPaintingName());
}
詳細代碼
public class AddDeleteAdapter extends PagedListAdapter<Teacher.RecordsBean, AddDeleteAdapter.ViewHolder> {
protected Context mContext;
private AddDeleteCallback mCallback;
public AddDeleteAdapter(Context context, AddDeleteCallback callback) {
super(new DiffUtil.ItemCallback<Teacher.RecordsBean>() {
@Override
public boolean areItemsTheSame(@NonNull Teacher.RecordsBean oldItem, @NonNull Teacher.RecordsBean newItem) {
return oldItem.getPaintingId() == newItem.getPaintingId();
}
@Override
public boolean areContentsTheSame(@NonNull Teacher.RecordsBean oldItem, @NonNull Teacher.RecordsBean newItem) {
return oldItem.equals(newItem);
}
});
this.mContext = context;
this.mCallback = callback;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutTeacherTypeBinding binding = LayoutTeacherTypeBinding.inflate(LayoutInflater.from(mContext), parent, false);
return new ViewHolder(binding.getRoot(), binding);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.binData(getItem(position));
holder.itemView.setOnClickListener(v -> {
mCallback.clickItem(position, getItem(position));
});
}
public class ViewHolder extends RecyclerView.ViewHolder {
private LayoutTeacherTypeBinding mBinding;
public ViewHolder(@NonNull View itemView, LayoutTeacherTypeBinding binding) {
super(itemView);
this.mBinding = binding;
}
public void binData(Teacher.RecordsBean item) {
mBinding.setItem(item);
}
}
public void addAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
dataSource.data.add(item);
dataSource.data.addAll(currentList.snapshot());
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public void deleteAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
for (Teacher.RecordsBean recordsBean : currentList.snapshot()) {
if (recordsBean != item) {
dataSource.data.add(recordsBean);
}
}
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public void upDateAndRefreshList(Teacher.RecordsBean item) {
PagedList<Teacher.RecordsBean> currentList = getCurrentList();
MutableItemKeyedDataSource<String, Teacher.RecordsBean> dataSource =
new MutableItemKeyedDataSource<String, Teacher.RecordsBean>((ItemKeyedDataSource) currentList.getDataSource()) {
@NonNull
@Override
public String getKey(@NonNull Teacher.RecordsBean item) {
return item.getPaintingId();
}
};
for (Teacher.RecordsBean recordsBean : currentList.snapshot()) {
if (recordsBean == item) {
recordsBean.setPaintingName("我是修改的:" + recordsBean.getPaintingName());
}
}
dataSource.data.addAll(currentList);
PagedList<Teacher.RecordsBean> pagedList = dataSource.buildNewPagedList(currentList.getConfig());
submitList(pagedList, new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
public class AddAndDeleteFragment extends AbsListFragment<Teacher.RecordsBean, AddDeleteViewModel> implements AddDeleteCallback {
private AlertDialog dialog;
private AddDeleteAdapter mAdapter;
public static AddAndDeleteFragment newInstance() {
return new AddAndDeleteFragment();
}
@Override
public void onDestroyView() {
super.onDestroyView();
dialog.dismiss();
}
@Override
protected void onCreateViewFrame(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRefreshLayout.setEnableLoadMore(false);
}
@Override
public PagedListAdapter getAdapter() {
mAdapter = new AddDeleteAdapter(mContext, this);
return mAdapter;
}
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
}
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
mViewModel.getDataSource().invalidate();
}
private int index = 0;
@Override
public void clickItem(int position, Teacher.RecordsBean item) {
Log.e("TTT", "position==>" + position);
dialog = new AlertDialog.Builder(mContext)
.setContentView(R.layout.layout_dialog)
.setTitle(R.id.tv_title, item.getPaintingName())
.setOnClicklistener(R.id.btn_add, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
index++;
Teacher.RecordsBean recordsBean = new Teacher.RecordsBean();
recordsBean.setPaintingId(item.getPaintingId() + index);
recordsBean.setPaintingName("我是新增加的數據");
mAdapter.addAndRefreshList(recordsBean);
}
})
.setOnClicklistener(R.id.btn_delete, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
mAdapter.deleteAndRefreshList(item);
}
})
.setOnClicklistener(R.id.btn_update, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
mAdapter.upDateAndRefreshList(item);
}
})
.setOnClicklistener(R.id.btn_query, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
List<Teacher.RecordsBean> lists = adapter.getCurrentList().snapshot();
for (Teacher.RecordsBean list : lists) {
Log.e("TTT", list.getPaintingId()+""+list.getPaintingName());
}
}
})
.addDefaultAnimation()
.setCancelable(true)
.fullWidth()
.show();
}
}
demo地址:https://gitee.com/huangxiaoguo/jetpackandrxjava