我面对复杂项目的滚动滚动问题。我试图建立如下图所示的视图。Many more item like this
我尝试#setHasStableIds #hasFixedSize #PreCacheLinearLayout #setItemViewCacheSize ...很多方法,但仍然落后。我知道可能是我的商品太复杂了,但这是要求:(如果您有解决此问题的想法,请帮助我!非常感谢<3
我的适配器是多视图类型。使用数据绑定,MVVM。此RecyclerView也在CoordinatorLayout的AppBarLayout下方。
RecyclerView:
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)
}
}
手项(2):
<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"
/>
和许多代码,但与上面相似。非常感谢!
嗨@Duy Pls使用此方法。rv.getRecycledViewPool()。setMaxRecycledViews(0,0);它可能会有所帮助。.有关方法说明,请参见this链接。