java - 向 RecyclerView 添加额外项目(将本地存储中的数据与在线服务器数据混合)
问题描述
我正在使用从服务器调用接收到的数据来膨胀 RecyclerView。现在我想从本地存储向这个 RecyclerView 添加一个项目(即一个可绘制的和一个手动的字符串)。让我展示一些我的代码和尝试过的方法,这些方法还没有为我工作。
FragmentCategoryList.java:
CategoryAdapter adapter;
ArrayList<CatDataItem> dataItems;
ArrayList<ExtraDataItem> extraItems;
void getCategories() {
ApiGetCategories.getInstance().setListener(this);
}
@Override
public void onGetCategories(CategoriesModel categoriesModel) {
isLoading = false;
dataItems = categoriesModel.getData();
setAdapter();
}
void setAdapter() {
if (adapter == null) {
//tried method dataItems.addAll(dataItems.size()+1, extraItems);
adapter = new CategoryAdapter(dataItems, getActivity());
recyclerCategory.setAdapter(adapter);
setLayoutManager();
} else {
//tried method dataItems.addAll(dataItems.size() +1, extraItems);
adapter.updateList(dataItems);
setLayoutManager();
}
}
....
CategoryAdapter.java 扩展了 RecyclerView.Adapter:
private ArrayList<CatDataItem> dataItems;
public CategoryAdapter(ArrayList<CatDataItem> dataItems, Context context) {
this.dataItems = dataItems;
this.context = context;
}
public void updateList(ArrayList<CatDataItem> dataItems) {
this.dataItems = dataItems;
notifyDataSetChanged();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_raw_category, parent, false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.tvCategory.setText(dataItems.get(position).getName());
Glide.with(AppController.getInstance())
.setDefaultRequestOptions(new RequestOptions()
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher))
.load(ApiClient.IMAGE_URL + dataItems.get(position).getImg() + ".png")
.into(holder.ivCategory);
holder.mainContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onCategoryClick != null) {
onCategoryClick.onClickCategory(position);
}
}
});
}
@Override
public int getItemCount() {
return dataItems.size();
}
....
CatDataItem.java:
这是 getter setter 类并使用了 com.google.gson.annotations.SerializedName;
...
@Override
public String toString() {
return
"DataItem{" +
"id = '" + id + '\'' +
",name = '" + name + '\'' +
",img = '" + img + '\'' +
",description = '" + description + '\'' +
"}";
}
...
分类型号:
@SerializedName("data")
private ArrayList<CatDataItem> data;
@SerializedName("message")
private String message;
public void setData(ArrayList<CatDataItem> data) {
this.data = data;
}
public ArrayList<CatDataItem> getData() {
return data;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
return
"CategoriesModel{" +
"data = '" + data + '\'' +
",message = '" + message + '\'' +
"}";
}
ExtraDataItem 扩展 CatDataItem:
我已经为 id、name、img 和 description 参数设置了静态值。一切都与 CatDataItem 相同。
一切正常,并以 3x* 网格放大非常美丽的景色。但现在我想在第一项的开头再添加一项。所以想要将所有项目进一步移动到一个索引。此外,额外的项目来自本地存储,而所有其他数据都来自远程服务器 API 调用。
所以我无法找到完美的方法来将一个字符串和图像添加到 RecyclerView 的第一个位置。
解决方案
终于在尝试了很多方法之后,我得到了这个问题的完美答案。
首先声明 DataItems 元素:
CatDataItem ee;
然后在 onCreateView 里面为这个元素添加一些值。
ee = new CatDataItem();
ee.setId("0");
ee.setName("Add");
ee.setImg("animals_pets");
ee.setDescription("desc");
最后将该元素添加到 DataItems 中的位置 0:
@Override
public void onGetCategories(CategoriesModel categoriesModel) {
isLoading = false;
dataItems = categoriesModel.getData();
dataItems.add(0, ee);
setAdapter();
}
谢谢你。
希望这可以帮助许多想要混合本地和在线数据的人。
推荐阅读
- go - 如何列出未与组织共享的 Google Drive 文件
- typescript - 在 aws beanstalk 上部署 nextjs/typescript 应用程序(快速服务器)
- jenkins - 如何阻止 Jenkins 重定向到端口 8443?
- assembly - 重写mips代码,使其最快
- python - 将使用 FFmpeg 截取的屏幕截图保存到 Amazon S3 存储桶中
- typescript - 为什么 Typescript 认为 [...T[], T] 和 [T, ...T[]] 不兼容?
- c# - 我可以只更改txt文件中的数字吗?
- javascript - 我试图从我的 d3js 树中删除空的孩子
- javascript - 如何再次调用 react useEffect
- sqlalchemy - Superset SqlAlchemy-Trino 错误:意外的数据库格式目录/hive/