Подтвердить что ты не робот

RecyclerView laggy scrolling

Я загружаю 400x200 изображений в RecyclerView, но прокрутка на устройствах с 2k задерживается. Я использую Пикассо для загрузки изображений с ресурса.

Как вы можете видеть на демо-изображениях, они размыты на экране 2k, но если я загружаю изображения с более высоким разрешением, ситуация ухудшается. Как это исправить, я даже не загружаю большое изображение, его 400х200?

демонстрация

Вот мой код 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 Code

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: Ребята Я установил большую часть задержки, установив adaptor.setHasStableIds(true), но приложение по-прежнему отстает при первой прокрутке, пока изображения еще не загружены, как это исправить?

ОБНОВЛЕНИЕ 3: Я только что попытался загрузить изображения из Интернета, и все выглядит гладко, возможно, есть проблема с загрузкой изображений из ресурса.

Хорошо, спасибо, ребята, я собираюсь загрузить свои изображения из Интернета.

4b9b3361

Ответ 2

Является ли RecyclerView.setHasFixedSize() равным true? Я не могу воспроизвести это отставание... можете ли вы отправить весь проект на git? Проверьте это, возможно, это может вам помочь: http://antonioleiva.com/recyclerview/

Ответ 3

Я полагаю, что иногда вы можете разозлить, когда пытаетесь только некоторые статические изображения в рисовать, чтобы отобразить ваш вид переработчика. И это бывает крайне отстающим.

Зачем? Вы можете не получить эту проблему при использовании какой-либо библиотеки для загрузки изображения из URL (Picasso, Glide,...), но что происходит с тем же изображением, тем же размером, и это прямо в вашей прорисовке (не нужно загружать в все). И через некоторое время, я выяснил, android сделал несколько трюков, чтобы изменить размер изображения, чтобы мы могли получить правильное изображение на устройствах с разным разрешением. Поэтому я предлагаю использовать drawable-nodpi для хранения вашего изображения, чтобы андроид не мешал нашим изображениям.

Ответ 4

Вы должны получать изображения асинхронно. Как и сейчас, он останавливается, чтобы загрузить изображение.

Оставьте изображение пустым, когда оно создано, но у него есть какой-то прослушиватель, чтобы установить изображение при его загрузке.

Ответ 5

если вы используете Recyclerview в вертикальном режиме, и ваша активность содержит другой элемент, который у вас есть ScrollView, тогда вы должны использовать NestedScrollView вместо ScrollView.

как описано в документации Google. NestedScrollView похож на ScrollView, но он поддерживает действие как родителя и дочернего родителя с прокруткой в ​​обеих новых и старых версиях Android. Вложенная прокрутка включена по умолчанию.

Ответ 6

У меня возникла проблема с laggy recyclerView, когда один из textView в recyclerView получал нулевые значения. Я исправляю это, и мой recyclerView перестает отставать.

Ответ 7

Это может быть из-за того, что Пикассо потратил время на загрузку изображения. Используйте приведенный ниже снимок и настройте его соответствующим образом.

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

Используйте fit() и centerCrop() чтобы избежать леггинсов.

Ответ 8

Я думаю, что причина в том, что Picasso кэширует ваши изображения, но так как у вас есть список чертежей, которые вы объединяете вместе с вашим приложением, вам теоретически не нужно кэшировать ваши изображения. Кэширование полезно только при загрузке изображения из Интернета, и вы не хотите, чтобы приложение повторно загружало изображения при каждом прокрутке вверх или вниз по recyclerview.

Я бы отрегулировал способ работы picasso, изменив memorypolicy, поэтому попробуйте это вместо:

 Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);