我正在使用从服务器调用接收到的数据来扩展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 + '\'' +
"}";
}
...
CategoriesModel:
@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中将一个字符串和图像添加到第一个位置的完美方法。
答案 0 :(得分:1)
最后,尝试了许多方法之后,我对这个问题有了一个完美的答案。
首先声明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();
}
谢谢。
希望这对很多想混合本地和在线数据的人有帮助。