Как оптимизировать автопрокрутку фиксированного размера RecyclerView - PullRequest
0 голосов
/ 07 марта 2020

У меня есть набор данных изображений фиксированного размера с параметрами (~ 100). Я хочу создать автоматическую прокрутку горизонтальных элементов для указанного устройства c. Проблема в том, что RecyclerView иногда закрывает и останавливает прокрутку достаточно плавно. Прежде чем я использовал библиотеку Glide с RecyclerView Preloader, но теперь изменил его на Fresco, потому что производительность лучше в библиотеке Facebook. Однако я хочу сделать дальнейшую оптимизацию. Не могли бы вы предложить что-нибудь?

Макет элемента (ранее это был ConstraintLayout, но LinearLayout меньше время рисования)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="153dp"
    android:layout_height="359dp"
    android:background="@android:color/white"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="0.55">

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/item_image"
            android:layout_width="153dp"
            android:layout_height="match_parent" />

        <TextView
            android:id="@+id/counter_txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:background="@drawable/rounded_textview"
            android:fontFamily="@font/light"
            android:gravity="center"
            android:textAlignment="center"
            android:textColor="@android:color/black"
            android:textSize="12sp" />

    </FrameLayout>

    <TextView
        android:id="@+id/item_name"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.125"
        android:background="#212121"
        android:fontFamily="@font/regular"
        android:gravity="center"
        android:autoSizeTextType="uniform"
        android:letterSpacing="0.1"
        android:paddingStart="8dp"
        android:paddingTop="8dp"
        android:paddingEnd="8dp"
        android:textAlignment="center"
        android:textColor="@android:color/white"
        android:paddingBottom="8dp" />

    <TextView
        android:id="@+id/rate"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_weight="0.2"
        android:drawablePadding="-15sp"
        android:fontFamily="@font/bold"
        android:gravity="center"
        android:padding="16dp"
        android:textAlignment="center"
        android:textColor="@android:color/black"
        android:textSize="40sp"
        android:textStyle="bold" />

</LinearLayout>

Конфиг

private val manager by lazy {
        val linearLayoutManager = SpeedyLinearLayoutManager(this) //calculateSpeedPerPixel override
        linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
        linearLayoutManager.initialPrefetchItemCount = adapter.itemsCount
        linearLayoutManager.isItemPrefetchEnabled = true
        linearLayoutManager
    }

 private fun initialize() {
        val snapHelper = LinearSnapHelper()
        snapHelper.attachToRecyclerView(rv)
        rv.isNestedScrollingEnabled = false
        rv.setHasFixedSize(true)
        rv.setItemViewCacheSize(0)
        rv.addItemDecoration(
            ItemDecor(
                resources.getDimension(R.dimen.default_padding).toInt()
            )
        )
        adapter.setHasStableIds(true)
        rv.layoutManager = manager
        rv.adapter = adapter
        rv.smoothScrollToPosition(0)
    }

Адаптер

class CardStackAdapter(
    private var spots: List<Spot> = emptyList()
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {


    var DELAY = 3000L

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return ViewHolder(inflater.inflate(R.layout.item_spot, parent, false))
    }

    fun showTopHolderAnim(holder: RecyclerView.ViewHolder) {
        holder.itemView.run {
            visibility = View.VISIBLE
            item_image.animateAlpha(DELAY)
            item_name.animateAlpha(DELAY)
            rate.animateAlpha(DELAY + 1000)
            DELAY += 1000L
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val spot = spots[position]

        holder.itemView.run {
            when {
                position < 4 -> {
                    showTopHolderAnim(holder)
                }
                position == itemCount - 1 -> {
                    item_image.alpha = 0f
                    item_name.alpha = 0f
                    rate.alpha = 0f
                }
            }
            item_name.text = spot.name
            rate.text = spot.rate
            counter_txt.text = (spots.size - position).toString()
            item_image.setImageURI(spot.imageUri)
        }
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getItemCount(): Int {
        return spots.size
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

}

Первый метод автоматической прокрутки

var scroll_speed = 70f
    fun startScroll() {
        handler.postDelayed({
            rv.smoothScrollBy(scroll_speed.toInt(), 0, LinearInterpolator())
            startScroll()
        }, 200)
    }

Второй

 public static void autoScroll(RecyclerView.Adapter adapter, RecyclerView view) {
        final int speedScroll = 0;
        final Handler handler = new Handler();
        final Runnable runnable = new Runnable() {
            int count = 0;

            @Override
            public void run() {
                if (count == adapter.getItemCount())
                    count = 0;
                if (count < adapter.getItemCount()) {
                    view.smoothScrollToPosition(++count);
                    handler.postDelayed(this, speedScroll);
                }
            }
        };
        handler.postDelayed(runnable, speedScroll);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...