Многокартовые серверные вызовы в RecyclerView.Adapter - PullRequest
0 голосов
/ 11 декабря 2018

Я мучился здесь, чтобы для каждого элемента, созданного в RecyclerView, я составлял внутренний список элементов Chip.И вы знаете, я сделал это, но теперь я мучаю свой сервер с каждой прокруткой этого RecyclerView.Как я могу сделать это, чтобы я не снимал сервер с каждой прокруткой?Вызов сервера происходит в моем случае, когда я вызываю метод getToastFromProduct productRepository

package com.example.myapplication.Adapters;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.example.myapplication.Application.CloudLiquid;
import com.example.myapplication.DataModel.ChipModel;
import com.example.myapplication.DataModel.ProductLayout.Information;
import com.example.myapplication.DataModel.ProductLayout.Product;
import com.example.myapplication.Managers.UuidManager;
import com.example.myapplication.R;
import com.example.myapplication.Retrofit.ProductRepository;
import com.example.myapplication.Retrofit.RatingRepository;
import com.example.myapplication.Retrofit.RetrofitBase;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.google.android.material.internal.FlowLayout;
import com.xiaofeng.flowlayoutmanager.FlowLayoutManager;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import co.lujun.androidtagview.TagContainerLayout;
import co.lujun.androidtagview.TagView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.Holder> {

    private List<com.example.myapplication.DataModel.ProductLayout.Product> products;
    private List<com.example.myapplication.DataModel.ProductLayout.Product> filteredList;
    private Context context;
    private RatingRepository rating;
    private CloudLiquid application;
    private CompositeDisposable compositeDisposable = new CompositeDisposable();
    private ProductRepository productRepository;

    public ProductAdapter(List<com.example.myapplication.DataModel.ProductLayout.Product> products, Context context) {
        this.products = products;
        this.context = context;
        this.filteredList = products;
        this.rating = RetrofitBase.getRetrofit().create(RatingRepository.class);
        this.application = (CloudLiquid) context;
        this.productRepository = RetrofitBase.getRetrofit().create(ProductRepository.class);
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itempreview, parent, false);
        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final Holder holder, final int position) {
        Glide.with(context).
                load(filteredList.get(position).getImage()).
                apply(new RequestOptions().override(512, 512)).
                into(holder.image);
        holder.product.setText(String.valueOf(filteredList.get(position).getName()));
        holder.company.setText(String.valueOf(filteredList.get(position).getManufacturer()));
        holder.comment.setText(String.valueOf(filteredList.get(position).getCommentCnt()));
        holder.like.setText(String.valueOf(filteredList.get(position).getLike()));
        holder.dislike.setText(String.valueOf(filteredList.get(position).getDislike()));
        compositeDisposable.add(productRepository.getToastFromProduct(String.valueOf(products.get(position).getId()))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<List<ChipModel>>() {
            @Override
            public void accept(List<ChipModel> chipModels) throws Exception {
                holder.category.removeAllViews();
                for (int i = 0; i < chipModels.size(); i++){
                    final Chip chip = new Chip(context);
                    chip.setChipBackgroundColor(context.getResources().getColorStateList(R.color.ms_black));
                    chip.setText(chipModels.get(i).getChipText());
                    chip.setTextColor(context.getResources().getColor(R.color.ms_white));
                    Glide.with(context)
                            .load(chipModels.get(i).getChipImage())
                            .into(new SimpleTarget<Drawable>() {
                                @Override
                                public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                                  chip.setChipIcon(resource);
                                }
                            });
                    holder.category.addView(chip);
                }
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                throwable.printStackTrace();
            }
        }));
        holder.commentImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CloudLiquid application = (CloudLiquid) context;
                Bundle bundle = new Bundle();
                bundle.putString("product_id", String.valueOf(filteredList.get(position).getId()));
                application.showCommentFragmet(bundle);
            }
        });

        holder.card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CloudLiquid application = (CloudLiquid) context;
                Bundle bundle = new Bundle();
                bundle.putString("id", String.valueOf(filteredList.get(position).getId()));
                application.showItemProfile(bundle);
            }
        });
        holder.likeimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                holder.compositeDisposable.add(rating.addRatingToProduct("Like", new UuidManager(context).getUuid(), String.valueOf(products.get(position).getId()))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Consumer<Product>() {
                            @Override
                            public void accept(Product product) throws Exception {
                                products.remove(position);
                                products.add(position, product);
                                notifyItemChanged(position);
                            }
                        }, new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                throwable.printStackTrace();
                            }
                        }));
            }
        });
        holder.dislikeimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.compositeDisposable.add(rating.addRatingToProduct("Dislike", new UuidManager(context).getUuid(), String.valueOf(products.get(position).getId()))
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Consumer<Product>() {
                            @Override
                            public void accept(Product product) throws Exception {
                                products.remove(position);
                                products.add(position, product);
                                notifyItemChanged(position);
                            }
                        }, new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                throwable.printStackTrace();
                            }
                        }));
            }
        });
    }


    @Override
    public int getItemCount() {
        return filteredList.size();
    }


    @Override
    public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
    }

    class Holder extends RecyclerView.ViewHolder {
        private AppCompatImageView image;
        private AppCompatTextView product, company, like, dislike, comment;
        private AppCompatImageView commentImage, dislikeimage, likeimage;
        private ChipGroup category;
        private MaterialCardView card;
        private CompositeDisposable compositeDisposable = new CompositeDisposable();

        public Holder(@NonNull View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.appCompatImageView4);
            commentImage = itemView.findViewById(R.id.appCompatImageView5);
            product = itemView.findViewById(R.id.appCompatTextView6);
            company = itemView.findViewById(R.id.appCompatTextView4);
            like = itemView.findViewById(R.id.appCompatTextView5);
            dislike = itemView.findViewById(R.id.appCompatTextView3);
            comment = itemView.findViewById(R.id.appCompatTextView);
            category = itemView.findViewById(R.id.parentlinear);
            card = itemView.findViewById(R.id.itempreview);
            dislikeimage = itemView.findViewById(R.id.appCompatImageView6);
            likeimage = itemView.findViewById(R.id.appCompatImageView7);
        }

        @Override
        public String toString() {
            return super.toString();
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...