У меня есть 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>?
)
}
}