首页 > 解决方案 > 如何在 Android 中将 RecyclerView 用于另一个 RecyclerView 的适配器?

问题描述

在我的应用程序中,我有一个列表,在这个列表中我有另一个列表!(我知道这对 UI 来说是个坏主意,但我应该开发这个!)
为了显示这个列表,我使用RecyclerView并将其他列表初始化RecyclerView到以前的RecyclerView 适配器中!

活动代码:

class DashboardCardsActivity : BaseActivity(), DashboardCardsContracts.View {

    @NonNull
    private lateinit var presenter: DashboardCardsPresenterImpl
    private var context: Context = this
    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: DashboardCardsAdapter
    private lateinit var layoutManager: LinearLayoutManager
    private val modelList: MutableList<UserPackageOrderResponse.Res.UserPackageOrder> = mutableListOf()
    private var isLoadingFlag = false
    private var isHasLoadedAll = false
    private var nextPage = 1
    //Token
    private var token = GoodPrefs.getInstance().getString(PrefsKey.USER_JWT_TOKEN.name, "")

    override var layoutId: Int = R.layout.activity_dashboard_cards

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //Initialize
        context = this
        presenter = DashboardCardsPresenterImpl(context, this)
        layoutManager = LinearLayoutManager(context)
        adapter = DashboardCardsAdapter(context, modelList)
        //Init recyclerView
        recyclerView = dashboardCards_pullList.recyclerView
        recyclerView.initRecyclerView(layoutManager, adapter)
        //Set image to loader
        dashboardCards_pullList.setColorSchemeResources(R.color.colorAccent)
        //Init toolbar
        toolbarBase_toolbar.title = getString(R.string.basketCard)
        toolbarBase_toolbar.setToolbarBackWithFinish(this)
        //Call api
        getLazyPullLoader()
    }

我写下面的代码:

class DashboardListAdapter constructor(
    val context: Context, val model: MutableList<UserPackageOrderResponse.Res.UserPackageOrder>
) : RecyclerView.Adapter<DashboardCardsAdapter.ViewHolder>() {

    private var expansionlayout: ExpansionLayoutCollection = ExpansionLayoutCollection()
    private lateinit var registerTimeUtil: TimeUtils
    private var registerDateSplit: List<String> = emptyList()
    private var registerDate: List<String> = emptyList()
    private var orderState: String = ""
    private var layoutManager: LinearLayoutManager? = null
    private var adapter: DashboardCardsOrderAdapter
    private val orderModelList: MutableList<UserPackageOrderResponse.Res.UserPackageOrder.Order> = mutableListOf()

    init {
        expansionlayout.openOnlyOne(true)
        layoutManager = object : LinearLayoutManager(context) {
            override fun canScrollVertically(): Boolean {
                return false
            }
        }
        adapter = DashboardCardsOrderAdapter(orderModelList)
    }

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

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

    @SuppressLint("SetTextI18n")
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        expansionlayout.add(holder.getExpansions())
        //header
        holder.orderNumber.text = model[position].hashcode
        holder.rowNumber.text = "${position + 1}"
        //Set date
        registerDateSplit = model[position].createdAt.split(" ")
        registerDate = registerDateSplit[0].split("-")
        registerTimeUtil = TimeUtils(registerDate[0].toInt(), registerDate[1].toInt(), registerDate[2].toInt())
        holder.orderRegisterDate.text = registerTimeUtil.getIranianDate()
        //Order state
        orderState = model[position].status
        holder.setViewWithState(orderState, context)
        //Content prices
        holder.finalPrice.text = "${model[position].price.moneySeparating()} ${context.getString(R.string.toman)}"
        holder.paymentPrice.text = "${model[position].price.moneySeparating()} ${context.getString(R.string.toman)}"
        holder.postPrice.text = "${model[position].postFee.moneySeparating()} ${context.getString(R.string.toman)}"
        holder.discountPrice.text = "${model[position].discount.moneySeparating()} ${context.getString(R.string.toman)}"
        //init order list
        orderModelList.clear()
        orderModelList.addAll(model[position].orders)
        layoutManager?.let {
            holder.orderList.initRecyclerView(it, adapter)
        }
    }
}

但是当运行应用程序时显示ForceClose错误并在logCat中显示以下消息:

java.lang.IllegalArgumentException: LayoutManager com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsAdapter$1@d33c634 is already attached to a RecyclerView: androidx.recyclerview.widget.RecyclerView{5a76c5d VFED..... ......ID 0,0-682,178 #7f080089 app:id/dashboardCard_orderList}, adapter:com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsOrderAdapter@83ba9d2, layout:com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsAdapter$1@d33c634, context:com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsActivity@79c2f05
        at androidx.recyclerview.widget.RecyclerView.setLayoutManager(RecyclerView.java:1340)
        at com.app.android.utils.ExtensionsKt.initRecyclerView(Extensions.kt:74)
        at com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsAdapter.onBindViewHolder(DashboardCardsAdapter.kt:77)
        at com.app.android.ui.home.fragments.dashboard.activities.carts_list.DashboardCardsAdapter.onBindViewHolder(DashboardCardsAdapter.kt:22)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)

但是在用以下情况更改我的代码后不会显示任何错误,但滚动非常缓慢并显示滞后

//init order list
orderModelList.clear()
orderModelList.addAll(model[position].orders)
layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean {
        return false
    }
}
layoutManager?.let {
    holder.orderList.initRecyclerView(it, adapter)
}

layoutManager我在 中初始化onBindView(),然后没有显示错误,但在滚动项目时显示了许多滞后!

我怎样才能解决这个问题?

标签: androidkotlinandroid-adapterandroid-recyclerview

解决方案


你已经定义了这个:

private var layoutManager: LinearLayoutManager? = null

定义另一个说,

private var layoutManager1: LinearLayoutManager? = null

将其分配给您的第二个RecyclerView并运行它。它应该工作。

PS:不熟悉Kotlin,在Java中我们使用

recyclerview.setLayoutManager(new LinearLayoutManager(MyActivity.this));


推荐阅读