web-dev-qa-db-ja.com

RecyclerViewのラグスクロール

RecyclerViewで400x200の画像を読み込んでいますが、2kデバイスではスクロールが遅くなります。リソースから画像を読み込むためにPicassoを使用しています。

デモでわかるように、2k画面では画像がぼやけていますが、高解像度の画像を読み込むと状況が悪化します。これを修正する方法、私は大きな画像、その400x200をロードしていませんか?

デモ

ここに私のコードがありますcard_view.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.CardView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card_view="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/card_view"
    card_view:cardPreventCornerOverlap="false"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_margin="8dp"
    card_view:cardCornerRadius="2dp">

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:id="@+id/rel">

        <ImageView
            Android:id="@+id/cardimage"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:scaleType="fitXY"
            Android:src="@drawable/p7"/>

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="title"
            Android:paddingLeft="16dp"
            Android:paddingRight="16dp"
            Android:paddingTop="16dp"
            Android:paddingBottom="24dp"
            Android:textStyle="bold"
            Android:textSize="24sp"
            Android:id="@+id/cardtitle"
            Android:layout_gravity="center_vertical"/>

    </LinearLayout>

</Android.support.v7.widget.CardView>

Myadapterコード

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

private Context mContext;
List<Flower> list = new ArrayList<>();

public CardAdapter(Context mContext, List<Flower> list) {
    this.mContext = mContext;
    this.list = list;

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)   {

    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);
    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position)  {

    holder.Flower=getItem(position);
    holder.cardtitle.setText(list.get(position).name);

    Picasso.with(mContext)
            .load(list.get(position).id)
            .placeholder(R.drawable.ic_launcher)
            .into(holder.cardimage);
}

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

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

public Flower getItem(int i) {
    return list.get(i);
}

public class ViewHolder extends RecyclerView.ViewHolder {

    ImageView cardimage;
    TextView cardtitle;
    Flower Flower;

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

        cardimage = (ImageView) itemView.findViewById(R.id.cardimage);
        cardtitle = (TextView) itemView.findViewById(R.id.cardtitle);
    }
}
}

更新:リソースから画像を読み込んでいますが、何もダウンロードしていません

これが私の配列です

 private void initializeData() {
    flowers = new ArrayList<>();
    flowers.add(new Flower("Flower 1", R.drawable.p8));
    flowers.add(new Flower("Flower 2", R.drawable.p10));
    flowers.add(new Flower("Flower 3", R.drawable.p11));
    flowers.add(new Flower("Flower 4", R.drawable.p8));
    flowers.add(new Flower("Flower 5", R.drawable.photo2));
    flowers.add(new Flower("Flower 6", R.drawable.photo6));
    flowers.add(new Flower("Flower 7", R.drawable.p12));
    flowers.add(new Flower("Flower 8", R.drawable.p9));
    flowers.add(new Flower("Flower 9", R.drawable.p8));
    flowers.add(new Flower("Flower 10", R.drawable.p8));
    flowers.add(new Flower("Flower 11", R.drawable.p8));
    flowers.add(new Flower("Flower 12", R.drawable.p10));
}

更新2:Guys私はadapter.setHasStableIds(true)を設定することでほとんどのラグを修正しましたが、画像がまだロードされていないのにアプリが最初のスクロールでまだ遅れています。

更新3:私はちょうどウェブから画像をロードしようとしましたが、すべてがスムーズに見えます。おそらくリソースから画像をロードする際に問題があります。

わかりました、ありがとうございます。ウェブから画像をロードします。

18
phlosopher_mk

(RecyclerViewとNestedView)のような2つ以上のリサイクラビューを使用している場合は、これを試してください

recyclerView.setNestedScrollingEnabled(false);

ソース: Nested Scrollviewスクロール内のRecyclerviewが、通常のRecyclerviewまたはNested Scrollviewのように高速スクロールしません

20
Dasser Basyouni

RecyclerView.setHasFixedSize()はtrueに設定されていますか?この遅れを再現することはできません...プロジェクト全体をgitに投稿してください。これをチェックしてください。多分あなたを助けることができます: http://antonioleiva.com/recyclerview/

10
Andrei Verdes

いくつかの表示可能なドローアブルの静止画像あなたのリサイクラービューだけを試してみると、時々腹を立てるかもしれません。そして、それは起こります非常に遅れています

どうして? RLから画像を読み込むためにライブラリを使用する場合、この問題は発生しない可能性があります(ピカソ、グライド、...)、しかし同じ画像、同じサイズ、それはあなたのドロアブルにあります(まったくダウンロードする必要はありません)。そしてしばらくして、私はAndroidが何らかのトリックをしてdrawableで画像のサイズを変更する私たちのために異なる解像度のデバイスで適切な画像を取得する =。したがって、私の提案drawable-nodpiを使用で、Android画像に干渉しないように画像を保存します。

7
Nguyen Tan Dat

recyclerviewを垂直モードで使用し、アクティビティにScrollViewがある他のアイテムが含まれている場合、NestedScrollViewの代わりにScrollViewを使用する必要があります。

googleのドキュメントで説明されているように、NestedScrollViewはScrollViewに似ていますが、Androidの新しいバージョンと古いバージョンの両方で、ネストされたスクロールの親と子の両方として機能します。ネストされたスクロールはデフォルトで有効になっています。

2
MSH

画像を非同期で取得する必要があります。現在のように、実際に画像をダウンロードするのは停止します。

Imageviewは作成時には空白のままにしますが、ダウンロード時に画像を設定するための何らかのリスナーを用意します。

2
BooleanCheese

これは、ピカソが画像の読み込みに時間がかかっているためである可能性があります。以下のスナップショットを使用し、それに応じて調整します。

_Picasso.with (context)
                    .load (url).fit().centerCrop()
                    .error (R.drawable.UserImage)         
                    .into (imageView);
_

fit()centerCrop()を使用して、脚色を避けます。

1
Harpreet Singh

RecyclerView内のtextViewの1つがnull値を受け取っていたときに、recyclerViewの遅延問題が発生しました。私はこれを修正し、recyclerViewは遅れを止めました。

1
S bruce