Kotlin Android RecyclerView внутри RecyclerView после прокрутки вида обновления - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть RecyclerView, и внутри для каждого элемента в моем первом RecyclerView я получаю еще один RecyclerView. Когда действие создано, все в порядке, но когда я обновляю свою коллекцию, представление немного прокручивается вниз, и я не вижу первого элемента в моем представлении:

это мой основной вид:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.EventsListActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/top_panel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="20sp"
            android:layout_marginEnd="20sp"
            android:background="@drawable/top_menu_blue">

        </RelativeLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/event_categories_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/top_panel"
            android:layout_marginTop="20sp" />

    </RelativeLayout>

</RelativeLayout>

это мой itemVIew:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20sp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_category_name"
        android:textSize="20sp"
        android:clickable="false"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/list_events"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv_category_name"
        android:layout_marginTop="10sp" />

</RelativeLayout>

Вот так я ставлю и обновляю главный вид:

private fun initEventsRecyclerView(
    context: Context,
    interaction: EventAdapter.Interaction
) {
event_categories_list.apply {
    eventCategoryAdapter = EventCategoryAdapter(
        eventsListModel.eventList,
        eventsListModel.ticketsList,
        interaction,
        context
    )
    adapter = eventCategoryAdapter

}
val linearLayoutManager = LinearLayoutManager(context)
event_categories_list.layoutManager = linearLayoutManager
event_categories_list.isNestedScrollingEnabled = true
event_categories_list.setHasFixedSize(true)
event_categories_list.layoutManager =
    LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

}

И вот как я положить на элемент:

itemView.list_events.apply {
            if (eventCategory.eventsList != null) {
                val eventCategoryAdapter = EventAdapter(
                    eventCategory,
                    eventCategory.eventsList,
                    ticketList,
                    interaction,
                    context
                )
                adapter = eventCategoryAdapter
            }

        }
        val linearLayoutManager = LinearLayoutManager(context)
        itemView.list_events.layoutManager = linearLayoutManager
        itemView.list_events.isNestedScrollingEnabled = true
        itemView.list_events.setHasFixedSize(true)
        itemView.list_events.layoutManager =
            LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

// edit Когда я делаю это для updateView:

eventCategoryAdapter.updateEventsCategoryList(eventsListModel.getFilterEvents(dt.time))
    eventCategoryAdapter.notifyDataSetChanged()

кража прокручивается вниз

// edit

Это основной адаптер:

class EventCategoryAdapter(
    eventsCategoryList: List<EventCategory>,
    ticketList: ArrayList<Ticket>,
    private val interaction: EventAdapter.Interaction? = null,
    val context: Context
) : RecyclerView.Adapter<EventCategoryAdapter.ViewHolder>() {

    private var eventsCategory = mutableListOf<EventCategory>()
    private val ticketListForEvents = ArrayList<Ticket>()

    init {
        eventsCategory.addAll(eventsCategoryList)
        ticketListForEvents.addAll(ticketList)
    }

    fun updateEventsCategoryList(eventsCategoryList: List<EventCategory>){
        eventsCategory = eventsCategoryList as MutableList<EventCategory>
        notifyDataSetChanged()
    }

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

    override fun getItemCount() = eventsCategory.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(eventsCategory[position],ticketListForEvents, context, interaction)
    }


    class ViewHolder(
        itemView: View
    ) : RecyclerView.ViewHolder(itemView) {

        fun bind(
            eventCategory: EventCategory,
            ticketList :ArrayList<Ticket>,
            context: Context,
            interaction: EventAdapter.Interaction?
        ) {
            itemView.tv_category_name.text = eventCategory.name
            itemView.list_events

            itemView.list_events.apply {
                if (eventCategory.eventsList != null) {
                    val eventCategoryAdapter = EventAdapter(
                        eventCategory,
                        eventCategory.eventsList,
                        ticketList,
                        interaction,
                        context
                    )
                    adapter = eventCategoryAdapter
                }

            }
            val linearLayoutManager = LinearLayoutManager(context)
            itemView.list_events.layoutManager = linearLayoutManager
            itemView.list_events.isNestedScrollingEnabled = true
            itemView.list_events.setHasFixedSize(true)
            itemView.list_events.layoutManager =
                LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
        }
    }

}

, а это дочерний адаптер:

class EventAdapter(
    private val eventCategory: EventCategory,
    eventsList: List<Event?>,
    ticketList: ArrayList<Ticket>,
    private val interaction: Interaction? = null,
    val context: Context
) : RecyclerView.Adapter<EventAdapter.ViewHolder>() {

    private val events = mutableListOf<Event?>()
    private val ticketListForEvents = ArrayList<Ticket>()

    init {
        events.addAll(eventsList)
        ticketListForEvents.addAll(ticketList)
    }

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

    override fun getItemCount() = events.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val event = events[position]
        if (event?.id != null)
            holder.bind(
                event,
                eventCategory,
                getTicketsForEvent(event.id, ticketListForEvents),
                context
            )
    }


    class ViewHolder(
        itemView: View,
        private val interaction: Interaction?
    ) : RecyclerView.ViewHolder(itemView) {

        fun bind(
            event: Event,
            eventCategory: EventCategory,
            ticketList: ArrayList<Ticket>?,
            context: Context
        ) {
            val activity = context as AppCompatActivity

            itemView.iv_event_thumbnail.clipToOutline = true

            Glide.with(context)
                .load("${BASE_URL}xxx${event.thumbnail}")
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .override(500,500)
                .into(itemView.iv_event_thumbnail)
            if (ticketList != null && ticketList.size > 0) {
                itemView.ticket_info_panel.visibility = View.VISIBLE
                itemView.iv_ticket_end.visibility = View.VISIBLE
                itemView.tv_ticket_counter.text = ticketList.size.toString()
            } else {
                itemView.ticket_info_panel.visibility = View.GONE
                itemView.iv_ticket_end.visibility = View.GONE
            }
            itemView.tv_event_name.text = event.title
            itemView.tv_event_short_descr.text = event.shortDescription
            itemView.setOnClickListener {
                interaction?.onItemSelected(adapterPosition, event, eventCategory,ticketList)
            }
        }
    }

    interface Interaction {
        fun onItemSelected(
            position: Int,
            event: Event,
            eventCategory: EventCategory,
            ticketList: ArrayList<Ticket>?
        )
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...