Android 具有复杂项的RecyclerView滚动问题
我面临着复杂项目的滞后滚动问题。 我试图建立一个像下图这样的视图。 我试着#设置hasstableId#hasFixedSize#PreCacheLinearLayout#设置ItemViewCacheSize。。。 还有很多路要走,但仍然落后。我知道可能是我的项目太复杂了,但这是要求:(Android 具有复杂项的RecyclerView滚动问题,android,performance,android-layout,android-recyclerview,Android,Performance,Android Layout,Android Recyclerview,我面临着复杂项目的滞后滚动问题。 我试图建立一个像下图这样的视图。 我试着#设置hasstableId#hasFixedSize#PreCacheLinearLayout#设置ItemViewCacheSize。。。 还有很多路要走,但仍然落后。我知道可能是我的项目太复杂了,但这是要求:( 如果您有一些解决此问题的想法,请帮助我!非常感谢大家使用此方法..rv.getRecycledViewPool().setMaxRecycledViews(0,0);这可能会有帮助..请参阅链接以获取方法说
如果您有一些解决此问题的想法,请帮助我!非常感谢大家使用此方法..rv.getRecycledViewPool().setMaxRecycledViews(0,0);这可能会有帮助..请参阅链接以获取方法说明..谢谢!这是一个改进
android:id="@+id/rvHome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorGrayLight"
android:clipToPadding="false"
app:items="@{viewModel.listData}"
android:nestedScrollingEnabled="true"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
@BindingAdapter("items")
fun<T> setItems(view: RecyclerView, model: ObservableArrayList<T>?) {
model?.let {
if(view.adapter is BaseRecyclerViewAdapter<*>){
(view.adapter as BaseRecyclerViewAdapter<T>).listItem = it;
}
}
}
abstract class BaseRecyclerViewAdapter<T>() :
RecyclerView.Adapter<BindingViewHolder>() {
var listItem: ObservableArrayList<T>? = null
set(value) {
value?.let {
onSettingListItem(it);
}
field = value
value?.let {
it.addOnListChangedCallback(onListChangedCallback)
}
notifyDataSetChanged()
}
var presenter: Presenter? = null
var decorator: Decorator? = null
fun add(t:T){
listItem?.let {
it.add(t)
notifyDataSetChanged()
}
}
fun addAll(items:Collection<T>){
Log.d("TAG","data $items")
Log.d("TAG","data $listItem")
listItem?.let {
it.addAll(items)
notifyDataSetChanged()
}
}
open fun onSettingListItem(list: ObservableArrayList<T>) {
}
val onListChangedCallback = object : ObservableList.OnListChangedCallback<ObservableList<T>>() {
override fun onChanged(sender: ObservableList<T>) {
notifyDataSetChanged()
}
override fun onItemRangeChanged(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeChanged(positionStart, itemCount)
}
override fun onItemRangeInserted(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeInserted(positionStart, itemCount)
}
override fun onItemRangeMoved(
sender: ObservableList<T>,
fromPosition: Int,
toPosition: Int,
itemCount: Int
) {
notifyItemMoved(fromPosition, toPosition)
}
override fun onItemRangeRemoved(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeRemoved(positionStart, itemCount)
}
}
override fun onBindViewHolder(holder: BindingViewHolder, position: Int) {
listItem?.let {
val item = it[position]
// set item variable
holder.binding.setVariable(BR.viewModel, item)
}
holder.binding.setVariable(BR.presenter, presenter)
// holder.binding.setVariable(BR.currentPos, position)
holder.binding.executePendingBindings()
if (decorator != null) {
decorator!!.decorate(holder, position, getItemViewType(position))
}
}
override fun getItemCount(): Int {
listItem?.let {
return it.size
}
return 0;
}
interface Presenter {
fun onItemClick(view: View, item: Any, position: Int)
}
interface Decorator {
fun decorate(holder: BindingViewHolder, position: Int, viewType: Int)
}
}
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_trending_trip"
style="@style/RecyclerHorizontalStyle"
android:nestedScrollingEnabled="false"
app:items="@{viewModel.data}"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>