0

こんにちは、私はRecyclerViewに問題があります 私はチャットのようなものを試しました。 私はときどき画像とテキストをテキストのみとし、recyclerviewの1つの行に画像しか表示しません。グライドを使用してRecyclerViewに画像を持つビューアをキャッシュする

スクロールせずに行がメモリ不足になるとすべてがうまく動作します。

メモリが枯渇して再び表示された場合は、プログレスバーのみ表示され、グライドはロードされません。

私は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); 

私viewholders .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); 

が、unsuccesfullを試してみました。それは多くのメモリを使用しています。

それは私の問題を説明するために必要なものです。私は良い説明のために画面をペーストする。

これは起動後の画面です。 enter image description here メモリが落ちてスクロールアップします。 enter image description here と、それは永久にロードしています下 enter image description here に戻って(グライドは、バックグラウンドで何もしない)グラフィックスのための

申し訳ありません:任意のアドバイスのためのDは

感謝。

===================================情報を追加========= ======================ここ

は私のために私onBindMethodですMyGeneriViewholderが

@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()); 

} 
+0

バインドビュー所有者メソッドを表示できますか? – damian

+0

はい、完了です。 – trip08

答えて

0

を実装しているので、私はと私の問題を解決setDataOnViewです.override(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); 

私はこれがうまくいくか分かりません。

関連する問題