代码之家  ›  专栏  ›  技术社区  ›  Parad0X

使用Glide将图像缓存到RecyclerView中

  •  0
  • Parad0X  · 技术社区  · 7 年前

    大家好,我对RecyclerView有问题 我试过聊天之类的。

    在不滚动的情况下,一切都很好,行也会从内存中消失。

    当内存不足时,我想再次显示它,行只显示进度条,滑动不加载。

    我使用glide into ViewHolder

    GlideApp.with(v).load(conv.getUrlFromServer()).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.mipmap.ic_launcher).centerCrop().listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        circleProgresBar.setVisibility(View.GONE);
                        pictureMsg.setVisibility(View.VISIBLE);
                        return false;
                    }
    
                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        pictureMsg.setVisibility(View.VISIBLE);
                        circleProgresBar.setVisibility(View.GONE);
                        return false;
                    }
                }).into(pictureMsg);
    

    我的观众。XML

       <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
    
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/LineLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="0dp"
            android:layout_marginLeft="0dp"
            android:layout_marginRight="0dp"
            android:layout_marginTop="0dp"
            android:gravity="left">
    
            <android.support.v7.widget.CardView
                android:id="@+id/rowCard"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/card_Bottom"
                android:layout_marginRight="@dimen/card_Right"
                android:layout_marginTop="@dimen/card_Top"
                card_view:cardCornerRadius="20dp"
                card_view:cardElevation="5dp">
    
                <android.support.constraint.ConstraintLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    tools:layout_editor_absoluteX="0dp"
                    tools:layout_editor_absoluteY="0dp">
    
                    <TextView
                        android:id="@+id/text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/text_End"
                        android:layout_marginStart="@dimen/textview_Start"
                        android:layout_marginTop="@dimen/textview_top"
                        android:gravity="left"
                        android:paddingRight="@dimen/textview_Right"
                        android:text="Kolo"
                        android:textColor="@color/black"
                        android:textSize="16sp"
                        card_view:layout_constraintBottom_toBottomOf="parent"
                        card_view:layout_constraintEnd_toEndOf="parent"
                        card_view:layout_constraintHorizontal_bias="0.0"
                        card_view:layout_constraintStart_toStartOf="parent"
                        card_view:layout_constraintTop_toTopOf="parent"
                        card_view:layout_constraintVertical_bias="0.0" />
    
                    <FrameLayout
                        android:id="@+id/frameLayout"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        card_view:layout_constraintBottom_toBottomOf="parent"
                        card_view:layout_constraintEnd_toEndOf="parent"
                        card_view:layout_constraintHorizontal_bias="0.5"
                        card_view:layout_constraintStart_toStartOf="parent"
                        card_view:layout_constraintTop_toBottomOf="@+id/text"
                        card_view:layout_constraintVertical_bias="0.5">
    
                        <ImageView
                            android:id="@+id/pictureMsg"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginEnd="@dimen/text_End"
                            android:layout_marginStart="@dimen/textview_Start"
                            android:adjustViewBounds="false"
                            android:minHeight="0dp"
                            android:visibility="visible" />
    
                        <ProgressBar
                            android:id="@+id/circleProgresBar"
                            style="?android:attr/progressBarStyle"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:visibility="gone" />
                    </FrameLayout>
    
                </android.support.constraint.ConstraintLayout>
    
    
            </android.support.v7.widget.CardView>
    
    
        </RelativeLayout>
    
    </LinearLayout>
    

    我试过这个

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setDrawingCacheEnabled(true);
        mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    

    但当增加缓存数量时,逻辑上对小滚动有帮助,但这并不是一个解决方案。这需要使用大量内存。

    这就是我想要你解释我的问题。我粘贴屏幕以便更好地解释。

    enter image description here enter image description here 然后回到底部 enter image description here 它是永久加载的(glide在后台什么都不做)

    谢谢你的建议。

    =====================================添加信息===============================

    @Override
        public void setDataOnView(int position, final RealmModel data) {
            RealmModelMessage conv = (RealmModelMessage) data;
            if (!conv.isStatus()) {
                mRow.setAlpha(0.5f);
            } else {
                mRow.setAlpha(1f);
            }
            RelativeLayout.LayoutParams llpCard;
            if (conv.getId_from() != mMyId) {
                mText.setGravity(Gravity.LEFT);
                mRow.setGravity(Gravity.LEFT);
             //   mText.setPadding(0, 0, mTextMargin_Right, 0);
    
                llpCard = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                llpCard.setMargins(0, mCardMargin_Top, mCardMargin_Right, mCardMargin_Bottom); // llp.setMargins(left, top, right, bottom)
                mCardView.setLayoutParams(llpCard);
                mCardView.setPadding(mTextMargin_Start, mTextMargin_Top, mTextMargin_End, mTextMargin_Bottom); // llp.setMargins(left, top, right, bottom);
                mCardView.setCardBackgroundColor(Color.argb(225,0,238,238));
    
                if (!String.valueOf(conv.getUrlFromServer()).equals("")){
                    pictureMsg.setVisibility(View.VISIBLE);
                    GlideApp.with(v).load(conv.getUrlFromServer()).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC).placeholder(R.mipmap.ic_launcher).fitCenter().listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            circleProgresBar.setVisibility(View.GONE);
                      //      Toast.makeText(v.getContext(), "Chyba obrázku", Toast.LENGTH_SHORT).show();
                            pictureMsg.setBackground(v.getContext().getResources().getDrawable(R.mipmap.ic_launcher));
                            pictureMsg.setVisibility(View.VISIBLE);
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            pictureMsg.setVisibility(View.VISIBLE);
                            circleProgresBar.setVisibility(View.GONE);
                            return false;
                        }
                    }).into(pictureMsg);} else {
                    pictureMsg.setVisibility(View.GONE);
                }
    
            } else {
                mText.setGravity(Gravity.RIGHT);
                mRow.setGravity(Gravity.RIGHT);
    
                llpCard = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                llpCard.setMargins(mCardMargin_Right, mCardMargin_Top, 0, mCardMargin_Bottom); // llp.setMargins(left, top, right, bottom)
                mCardView.setLayoutParams(llpCard);
                mCardView.setPadding(0, mTextMargin_Top, mTextMargin_Start, mTextMargin_Bottom); // llp.setMargins(left, top, right, bottom)
                mCardView.setCardBackgroundColor(Color.argb(225,238,238,0));
    
                if (!String.valueOf(conv.getUrlFromServer()).equals("")){
                    circleProgresBar.setVisibility(View.VISIBLE);
                   // pictureMsg.setVisibility(View.VISIBLE);
                  //GlideApp.with(v).load(conv.getUrlFromServer()).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC).placeholder(R.mipmap.ic_launcher).centerCrop().into(pictureMsg);
                   GlideApp.with(v).load(conv.getUrlFromServer()).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.mipmap.ic_launcher).centerCrop().listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            circleProgresBar.setVisibility(View.GONE);
                            Toast.makeText(v.getContext(), "Chyba obrázku", Toast.LENGTH_SHORT).show();
                            pictureMsg.setVisibility(View.VISIBLE);
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            pictureMsg.setVisibility(View.VISIBLE);
                            circleProgresBar.setVisibility(View.GONE);
                            return false;
                        }
                    }).into(pictureMsg);
    
                    /*        Drawable drawable=pictureMsg.getDrawable();
                    double width =pictureMsg.getDrawable().getIntrinsicHeight();
                    double heigh =pictureMsg.getDrawable().getIntrinsicWidth();
                    double widthInScreen= v.getContext().getResources().getDimension(R.dimen.minWidth_Image150dp);
                    double constant= widthInScreen/width;
                    double newWidth= width*constant;
                    double newHeigh= heigh*constant;
                    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams((int) newWidth,(int) newHeigh);
                    pictureMsg.setLayoutParams(layoutParams);
                    */
                } else {
                    pictureMsg.setVisibility(View.GONE);
                }
    
            }
    
            mText.setText(conv.getText());
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Parad0X    7 年前

    我用解决我的问题。覆盖(int)

    比如()之间的这个尺寸是宽度和高度。

    GlideApp.with(v).load(conv.getUrlFromServer()).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC).override((int) v.getContext().getResources().getDimension(R.dimen.minWidth_Image150dp), v.getContext().getResources().getDimension(R.dimen.minWidth_Image150dp)).placeholder(R.mipmap.ic_launcher).centerCrop().listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            circleProgresBar.setVisibility(View.GONE);
                            Toast.makeText(v.getContext(), "Chyba obrázku", Toast.LENGTH_SHORT).show();
                            pictureMsg.setVisibility(View.VISIBLE);
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            pictureMsg.setVisibility(View.VISIBLE);
                            circleProgresBar.setVisibility(View.GONE);
                            return false;
                        }
                    }).into(pictureMsg);