Как использовать RecyclerView в другом адаптере RecyclerView в Android? - PullRequest
0 голосов
/ 14 мая 2019

В моем приложении у меня есть один список, и в этом у меня есть другой список! (Я знаю, что это плохая идея для пользовательского интерфейса, но я должен разработать это!)
Для показа этого списка я использовал 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(), затем не выдает ошибку, но показывает много лагов при прокрутке по элементам!

Как я могу это исправить?

1 Ответ

0 голосов
/ 14 мая 2019

Вы определили это:

private var layoutManager: LinearLayoutManager? = null

Определите еще одно, скажем,

private var layoutManager1: LinearLayoutManager? = null

Назначьте это второму RecyclerView и запустите его. Это должно работать.

P.S .: Не знаком с Kotlin, в Java мы используем

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

...