简体   繁体   English

RecyclerView 从活动返回后滚动缓慢

[英]RecyclerView Scrolling slow after returning from activity

I have an activity that has a RecyclerView with cardViews.我有一个带有 CardViews 的 RecyclerView 的活动。 This recyclerView is populated by a service response.此 recyclerView 由服务响应填充。 The first time I enter to the activity, the recyclerView scroll down and up normal, with normal speed.我第一次进入活动时,recyclerView 正常上下滚动,速度正常。 If I tap on one of the cardView, there is an Intent to go to an activity detail of this card.如果我点击其中一个 cardView,则有一个 Intent to go 到此卡的活动详细信息。 If I come back to the recyclerView (by tapping the back button), the scroll down and up of the recyclerView is slower, y if I enter again to the detail, and come back, the scroll is slower than the last time and so on.如果我回到recyclerView(通过点击后退按钮),recyclerView 的向下和向上滚动更慢,y 如果我再次进入细节,然后回来,滚动比上次慢等等.

This is the adapter code:这是适配器代码:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {

    private FirebaseFirestore db;
    private Context mContext;
    private ArrayList<Cupon> mList;
    private CountryUser cu;

    public CardAdapter(Context context, ArrayList<Cupon> list, FirebaseFirestore db, CountryUser cu) {
        this.mContext = context;
        this.mList = list;
        this.db = db;
        this.cu = cu;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.rv_card_items, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
        viewHolder.bind(mList.get(i));
    }

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

    @Override
    public long getItemId(int position) {
        return mList.get(position).hashCode(); //id()
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView titulo;
        private TextView subtitulo;
        private TextView precioReal;
        private TextView precioDesc;
        private ImageView imagen;
        private ImageView imgComercio;
        private ImageButton fav;
        private CardView cardView;

        private ViewHolder(View itemView) {
            super(itemView);

            titulo = itemView.findViewById(R.id.txt_titulo);
            subtitulo = itemView.findViewById(R.id.txt_subtitulo);
            precioReal = itemView.findViewById(R.id.txt_precioReal);
            precioDesc = itemView.findViewById(R.id.txt_precioDesc);
            imagen = itemView.findViewById(R.id.imageview_imagenCupon);
            imgComercio = itemView.findViewById(R.id.img_comercio);
            cardView = itemView.findViewById(R.id.card_view);
            fav = itemView.findViewById(R.id.fav);
        }

        private void bind(Cupon cardItem){

            favorite(Objects.requireNonNull(cardItem.getIdCategoria()));

            titulo.setText(cardItem.getTitulo());
            subtitulo.setText(cardItem.getSubtitulo());
            precioReal.setText(cardItem.getPrecioReal());
            precioDesc.setText(cardItem.getPrecioDesc());

            if (imagen != null) {
                Picasso.get()
                        .load(cardItem.getImagenCupon())
                        .fit()
                        .centerCrop()
                        .error(R.drawable.notfound)
                        .into(imagen);
            }

            if (imgComercio != null){
                Picasso.get()
                        .load(cardItem.getImagenComercio())
                        .fit()
                        .centerInside()
                        .error(R.drawable.notfound)
                        .into(imgComercio);
            }

            fav.setOnClickListener(v -> {
                Animation animScale = AnimationUtils.loadAnimation(mContext, R.anim.scale_fav);
                v.startAnimation(animScale);
                addFav(cardItem.getIdCategoria());
            });

            cardView.setOnClickListener(v -> mContext.startActivity(DetalleCuponActivity.getIntent(mContext, cardItem.getIdCategoria(), "0")));
        }

        private void favorite(String id) {
            String favorito = "0";
            db.collection("Favorito")
                    .whereEqualTo("idUsuario", Fn.Companion.getUserUID())
                    .whereEqualTo("idCupon", id)
                    .whereEqualTo("estado", favorito)
                    .get()
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()) {
                            if (Objects.requireNonNull(task.getResult()).isEmpty()) {
                                fav.setBackgroundResource(R.drawable.ic_favorito);
                            } else {
                                Animation animScale = AnimationUtils.loadAnimation(mContext, R.anim.scale_fav);
                                fav.startAnimation(animScale);
                                fav.setBackgroundResource(R.drawable.ic_corazon);
                            }
                        } else Log.d("ERROR", "Error getting documents: ", task.getException());
                    });
        }

        private void addFav(final String id) {
            String favorito = "0";
            db.collection("Favorito")
                    .whereEqualTo("idUsuario", Fn.Companion.getUserUID())
                    .whereEqualTo("idCupon", id)
                    .whereEqualTo("estado", favorito)
                    .get()
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()) {
                            if (Objects.requireNonNull(task.getResult()).isEmpty()) {
                                fav.setBackgroundResource(R.drawable.ic_corazon);

                                String pais = cu.getAbr();

                                Map<String, Object> newFav = new HashMap<>();
                                newFav.put("idUsuario", Fn.Companion.getUserUID());
                                newFav.put("idCupon", id);
                                newFav.put("fecha", new Date(System.currentTimeMillis()));
                                newFav.put("estado", "0");
                                newFav.put("tipo", "c");
                                newFav.put("pais", pais);

                                db.collection("Favorito")
                                        .add(newFav)
                                        .addOnFailureListener(e -> fav.setBackgroundResource(R.drawable.ic_favorito));
                            } else {
                                fav.setBackgroundResource(R.drawable.ic_favorito);
                                for (QueryDocumentSnapshot document : task.getResult()) {
                                    DocumentReference ref = db.collection("Favorito").document(document.getId());
                                    ref.update("estado", "1")
                                            .addOnFailureListener(e -> fav.setBackgroundResource(R.drawable.ic_corazon));
                                }
                            }
                        } else Log.d("ERROR", "Error getting documents: ", task.getException());
                    });
        }
    }

    @Override
    public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
        RoomDataBase.destroyInstance();
        mContext = null;
        cu = null;
    }

    public void setFilter(ArrayList<Cupon> newCupon) {
        mList = new ArrayList<>();
        mList.addAll(newCupon);
        notifyDataSetChanged();
    }

}

And this is the way I setup the recyclerView:这就是我设置 recyclerView 的方式:

PreCachingLayoutManagerHelper rvLiLayoutManager = new PreCachingLayoutManagerHelper(this);
            rvLiLayoutManager.setOrientation(androidx.recyclerview.widget.LinearLayoutManager.VERTICAL);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
rvLiLayoutManager.setExtraLayoutSpace(metrics.heightPixels * 3);
recyclerView.setLayoutManager(rvLiLayoutManager);

cardAdapter = new CardAdapter(mContext, cardList, FirebaseFirestore.getInstance(),Fn.Companion.getUserSession());
recyclerView.setAdapter(cardAdapter);

And this is the view: BusquedaActivity这是视图: BusquedaActivity

Thank you so much for your help.非常感谢你的帮助。

EDIT: this is the whole activity code.编辑:这是整个活动代码。

public class BusquedaActivity extends BaseActivity implements CardAdapter.CardAdapterCallback {

    public final static String OPCIONID = "opcionid";
    public final static String CATEGORYNAME = "categoryiname";
    private SwipeRefreshLayout swipeRefreshLayout;
    private Dialog dialog;
    private LinearLayout emptytId;
    private RecyclerView recyclerView;
    private ArrayList<Cupon> cardList;
    private ArrayList<VipCoupon> dataList;
    private CardAdapter cardAdapter;
    private VipCouponAdapter vipCouponAdapter;
    private CardView commerceCoupon;
    private CardView vipCoupon;
    private final boolean fav = false;
    // Modification Custom Search Adapter
    private SearchView searchView;
    private CustomSearchAdapter mAdapter;
    private TextView generalCardText;
    private TextView vipCardText;
    private boolean activeVIP = false;

    public static Intent getIntent(Context context, String opcion, String name) {
        return new Intent(context, BusquedaActivity.class)
                .putExtra(OPCIONID, opcion)
                .putExtra(CATEGORYNAME, name);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_busqueda);

        // Toolbar
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        // Views
        swipeRefreshLayout = findViewById(R.id.swipe);
        commerceCoupon = findViewById(R.id.commerceCoupon);
        vipCoupon = findViewById(R.id.vipCoupon);
        generalCardText = findViewById(R.id.general);
        vipCardText = findViewById(R.id.vip);
        emptytId = findViewById(R.id.emptytId);
        dialog = new Dialog(BusquedaActivity.this);
        dialog.setContentView(R.layout.custom_loader);
        recyclerView = findViewById(R.id.rv);

        // RecyclerView
        recyclerView.setHasFixedSize(true);
        recyclerView.setNestedScrollingEnabled(true);
        recyclerView.setItemViewCacheSize(Global.PAGE_SIZE * 2);
        recyclerView.setDrawingCacheEnabled(true);
        recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

        PreCachingLayoutManagerHelper rvLiLayoutManager = new PreCachingLayoutManagerHelper(this);
        rvLiLayoutManager.setOrientation(androidx.recyclerview.widget.LinearLayoutManager.VERTICAL);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        rvLiLayoutManager.setExtraLayoutSpace(metrics.heightPixels * 3);
        recyclerView.setLayoutManager(rvLiLayoutManager);

        // Adapter
        cardList = new ArrayList<>();
        dataList = new ArrayList<>();
        cardAdapter = new CardAdapter(this, cardList, FirebaseFirestore.getInstance(), this);
        cardAdapter.setHasStableIds(true);
        vipCouponAdapter = new VipCouponAdapter(this, dataList);
        vipCouponAdapter.setHasStableIds(true);

        TextView titulo = findViewById(R.id.toolbar_title);
        titulo.setText(Objects.requireNonNull(getIntent().getExtras()).getString(CATEGORYNAME));

        Objects.requireNonNull(dialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCancelable(true);
        dialog.show();

        dialog.setOnCancelListener(dialog -> {
            finish();
            dialog.dismiss();
        });

        swipeRefreshLayout.setOnRefreshListener(() -> {
            if (activeVIP) {
                emptytId.setVisibility(View.GONE);
                commerceCoupon.setEnabled(true);
                vipCoupon.setEnabled(false);
                generalCardText.setBackgroundColor(getResources().getColor(R.color.loader));
                vipCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
                recyclerView.setAdapter(vipCouponAdapter);
                cardList.clear();
                dataList.clear();
                if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
                    aprovechaYaVIP();
                } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
                    loNuevoVIP();
                } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
                    mejoresDescuentosVIP();
                }
            } else {
                emptytId.setVisibility(View.GONE);
                commerceCoupon.setEnabled(false);
                vipCoupon.setEnabled(true);
                generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
                vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
                recyclerView.setAdapter(cardAdapter);
                cardList.clear();
                dataList.clear();
                if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
                    aprovechaYa();
                } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
                    loNuevo();
                } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
                    mejoresDescuentos();
                }
            }
        });

        commerceCoupon.setOnClickListener(view -> {
            activeVIP = false;
            emptytId.setVisibility(View.GONE);
            commerceCoupon.setEnabled(false);
            vipCoupon.setEnabled(true);
            generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
            vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
            recyclerView.setAdapter(cardAdapter);
            cardList.clear();
            dataList.clear();
            if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
                aprovechaYa();
            } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
                loNuevo();
            } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
                mejoresDescuentos();
            }
        });

        vipCoupon.setOnClickListener(view -> {
            activeVIP = true;
            emptytId.setVisibility(View.GONE);
            commerceCoupon.setEnabled(true);
            vipCoupon.setEnabled(false);
            generalCardText.setBackgroundColor(getResources().getColor(R.color.loader));
            vipCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
            recyclerView.setAdapter(vipCouponAdapter);
            cardList.clear();
            dataList.clear();
            if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
                aprovechaYaVIP();
            } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
                loNuevoVIP();
            } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
                mejoresDescuentosVIP();
            }
        });

        mAdapter = new CustomSearchAdapter(this, null);

        // Show Data
        initData();
    }

@Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        this.finish();
        return super.onSupportNavigateUp();
    }

    @Override
    protected void onDestroy() {
        recyclerView.setAdapter(null);
        searchView = null;
        super.onDestroy();
    }

private void initData() {
        activeVIP = false;
        emptytId.setVisibility(View.GONE);
        commerceCoupon.setEnabled(false);
        vipCoupon.setEnabled(true);
        generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
        vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
        cardList.clear();
        dataList.clear();
        if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
            aprovechaYa();
        } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
            loNuevo();
        } else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
            mejoresDescuentos();
        }
    }

private void mejoresDescuentos() {
        Call<ArrayList<Cupon>> mejor = getRetrofit().create(Api.class).getMejores(Fn.Companion.getUserCountry());

        mejor.enqueue(new Callback<ArrayList<Cupon>>() {
            @Override
            public void onResponse(@NonNull Call<ArrayList<Cupon>> call, @NonNull Response<ArrayList<Cupon>> response) {
                if (response.code() == 200) {
                    ArrayList<Cupon> ap = response.body();
                    if (Objects.requireNonNull(ap).isEmpty()) {
                        showEmptyLayout(true);
                        dialog.dismiss();
                        swipeRefreshLayout.setRefreshing(false);
                    } else {
                        showEmptyLayout(false);
                        DecimalFormat format = new DecimalFormat("###,###.00");
                        String m = Fn.Companion.getUserSession().getMoneda();
                        for (Cupon c : Objects.requireNonNull(ap)) {
                            String realPrice = "null";
                            String descPrice = "null";
                            String descuentoCode;
                            if (c.getFbCodeType() == null || c.getFbCodeType().equals("")) {
                                descuentoCode = "1";
                            } else {
                                descuentoCode = c.getFbCodeType();
                            }

                            if (descuentoCode == null || descuentoCode.equals("") || descuentoCode.equals("1")) {
                                double real = Double.parseDouble(c.getPrecioReal());
                                realPrice = String.valueOf(Html.fromHtml("<strike>" + m + " " + format.format(real) + "</strike>"));
                                double descuento = Double.parseDouble(c.getPrecioDesc());
                                descPrice = m + " " + format.format(descuento);
                            } else if (descuentoCode.equals("2")) {
                                realPrice = "";
                                double descuento = Double.parseDouble(c.getPrecioDesc());
                                descPrice = format.format(descuento) + " %";
                            } else if (descuentoCode.equals("3")) {
                                realPrice = "";
                                double descuento = Double.parseDouble(c.getPrecioDesc());
                                descPrice = m + " " + format.format(descuento);
                            }

                            cardList.add(new Cupon(c.getIdCategoria(), c.getTitulo(), c.getSubtitulo(), descPrice, realPrice, c.getDescripcion(), c.getTyc(), c.getCantCanje(), c.getCantCanjeUSER(), c.getFechaInicio(), c.getFechaFin(), c.getImagenCupon(), c.getImagenComercio(), c.getNombreComercio(), c.getIdComercio(), c.getWhatsapp(), c.getInstagram(), c.getFacebook(), c.getPais(), descuentoCode,fav));
                        }
                        cardAdapter.notifyDataSetChanged();
                        dialog.dismiss();
                        swipeRefreshLayout.setRefreshing(false);
                    }
                } else {
                    showEmptyLayout(true);
                    dialog.dismiss();
                    swipeRefreshLayout.setRefreshing(false);
                }
            }

            @Override
            public void onFailure(@NonNull Call<ArrayList<Cupon>> call, @NonNull Throwable t) {
                Fn.Companion.showError(BusquedaActivity.this, getString(R.string.error_connection));
                showEmptyLayout(true);
                dialog.dismiss();
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }
Picasso.get()
                    .load(url)
                    .error(R.drawable.mini_map)
                    .placeholder(R.drawable.mini_map)
                    .centerInside()
                    .resize(400,200)
                    .into(postHolder.i_image);

solved this problem.解决了这个问题。 this problems occurs when trying to render big sized images with Glide.尝试使用 Glide 渲染大尺寸图像时会出现此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM