向RecyclerView添加额外的项(将本地存储中的数据与Online Server数据混合)

时间:2018-12-15 10:16:41

标签: java android android-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 + '\'' +
                        "}";
    }
...

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中将一个字符串和图像添加到第一个位置的完美方法。

1 个答案:

答案 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();

    }

谢谢。

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