У меня есть набор данных изображений фиксированного размера с параметрами (~ 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);
}