こんにちは、私は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を試してみました。それは多くのメモリを使用しています。
それは私の問題を説明するために必要なものです。私は良い説明のために画面をペーストする。
これは起動後の画面です。 メモリが落ちてスクロールアップします。 と、それは永久にロードしています下 に戻って(グライドは、バックグラウンドで何もしない)グラフィックスのための
申し訳ありません:任意のアドバイスのための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());
}
バインドビュー所有者メソッドを表示できますか? – damian
はい、完了です。 – trip08