首页 > 解决方案 > 向 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 的第一个位置。

标签: javaandroidandroid-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();

    }

谢谢你。

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


推荐阅读