gpt4 book ai didi

java - 向 RecyclerView 添加额外项目(将本地存储的数据与在线服务器数据混合)

转载 作者:行者123 更新时间:2023-11-29 23:24:12 25 4
gpt4 key购买 nike

我正在用从服务器调用接收到的数据填充 RecyclerView。现在我想从本地存储中向此 RecyclerView 添加一个项目(即一个可绘制对象和一个手动字符串)。让我展示一些我的代码和尝试过但对我不起作用的方法。

fragment 类别列表.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();
}
....

猫数据项.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* 网格的非常美丽的 View 。但是现在我想在第一项的开头再添加一项。所以想将所有项目进一步移动到一个索引。此外,额外的项目来自本地存储,而所有其他数据来自远程服务器 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();

}

谢谢。

希望这可以帮助很多想要混合本地和在线数据的人。

关于java - 向 RecyclerView 添加额外项目(将本地存储的数据与在线服务器数据混合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53791406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com