Вот упрощенная версия моего проекта.Допустим, у меня есть text view
выше recycler view
, который находится внутри nested scroll view
, как на изображении ниже
Вот XMLмой проект:
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" android:id="@+id/nestedScrollView_user_control">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/constraintLayout_profile">
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/textView3"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:nestedScrollingEnabled="false"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textView3"
tools:listitem="@layout/item_general_event" android:id="@+id/recyclerView_attended_event_user_control"
android:layout_marginTop="120dp">
</androidx.recyclerview.widget.RecyclerView>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar_user_control"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
Вот видео проблемы моего приложения: https://drive.google.com/file/d/1E6N0xGDp8sBPrLgwfctTEWeSfyPHevyj/view
Как вы можете видеть, оно находится на последнем tab
в bottom navigation view
.В самый первый раз, когда я нажимаю на эту вкладку (после того, как я полностью закрываю приложение), поведение второго виджета выглядит так:
-
text view
немедленно появится - тогда
progress bar
покажет (выборка данных с сервера) recycler view
в конечном итоге появится.
, но когда я переключаюсь с последней вкладки в представлении bottom navigation
,скажем, к первой вкладке, а затем снова к последней вкладке, мое приложение будет выглядеть медленным.textView
не появится сразу.Он ждет, даже progressBar
не отображается, и он будет отображаться одновременно с recyclerView
.
Похоже, recyclerView
устанавливает элемент и извлекает данные в то же времявремя (не знаю почему), из-за которого мое приложение выглядит медленным.
Я хочу, чтобы текстовое представление сразу отображалось после нажатия вкладки в bottom navigation view
Ниже приведен код, который я использую:
class UserControlFragment : Fragment(), EasyPermissions.PermissionCallbacks {
lateinit var nestedScrollView: NestedScrollView
lateinit var progressBar : ProgressBar
lateinit var fragmentView : View
lateinit var recyclerView : RecyclerView
lateinit var sharedPrefManager : SharedPreferenceManager
lateinit var userControlAdapter : GeneralEventRecyclerViewAdapter
private var attendedEvents = ArrayList<Event>()
private var userData : User? = null
lateinit var mContext : Context
lateinit var mActivity : FragmentActivity
override fun onAttach(context: Context) {
super.onAttach(context)
mContext = context
activity?.let { mActivity = it }
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
fragmentView = inflater.inflate(R.layout.fragment_user_control, container, false)
sharedPrefManager = SharedPreferenceManager.getInstance(mContext)
setUpViewsDeclaration()
getUserData()
initRecyclerView()
getAttendedEvents()
return fragmentView
}
private fun setUpViewsDeclaration() {
nestedScrollView = fragmentView.findViewById(R.id.nestedScrollView_user_control)
progressBar = fragmentView.findViewById(R.id.progressBar_user_control)
recyclerView = fragmentView.findViewById(R.id.recyclerView_attended_event_user_control)
}
private fun getUserData() {
userData = sharedPrefManager.loadUserData()
}
private fun initRecyclerView() {
userControlAdapter = GeneralEventRecyclerViewAdapter(mContext)
val layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL,false)
recyclerView.adapter = userControlAdapter
recyclerView.layoutManager = layoutManager
nestedScrollView.isNestedScrollingEnabled = false
userControlAdapter.setOnItemClickListener(object: OnEventKMListener {
override fun eventKMClicked(position: Int) {
val selectedEvent = attendedEvents[position]
val eventDetailDestination = UserControlFragmentDirections.actionGlobalDestinationEventDetail(selectedEvent)
Navigation.findNavController(fragmentView).navigate(eventDetailDestination)
}
})
}
private fun getAttendedEvents() {
val user = userData ?: return
progressBar.visibility = View.VISIBLE
FirestoreKMClient.getRecommendedEvents(user.domicile) { errorMessage, events ->
progressBar.visibility = View.GONE
errorMessage?.let {
mActivity.toast(it)
} ?: run {
val eventList = events ?: ArrayList()
attendedEvents = eventList
userControlAdapter.submitList(eventList)
}
}
}
}
и вот код, который я использую для адаптера:
class GeneralEventRecyclerViewAdapter(val mContext: Context): ListAdapter<Event, RecyclerView.ViewHolder>(DIFF_CALLBACK) {
lateinit var mOnEventKMListener : OnEventKMListener
fun setOnItemClickListener(listener: OnEventKMListener) {
mOnEventKMListener = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_general_event, parent, false)
return GeneralEventViewHolder(itemView, mOnEventKMListener)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val currentEvent = getItem(position)
val generalEventViewHolder = holder as GeneralEventViewHolder
Glide.with(mContext).load(currentEvent.thumbnailDownloadPath)
.apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3)))
.into(generalEventViewHolder.blurThumbnailImageView)
Glide.with(mContext).load(currentEvent.thumbnailDownloadPath).into(generalEventViewHolder.thumbnailImageView)
generalEventViewHolder.eventNameTextView.text = currentEvent.title
generalEventViewHolder.eventVenueTextView.text = currentEvent.venue
generalEventViewHolder.eventDateTimeTextView.text = DateTimeService.changeDateToString("EEEE, d MMMM. HH:mm zzz",currentEvent.dateTimeStart)
}
companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Event>() {
override fun areItemsTheSame(oldItem: Event, newItem: Event): Boolean {
return oldItem.eventID == newItem.eventID
}
override fun areContentsTheSame(oldItem: Event, newItem: Event): Boolean {
return oldItem == newItem
}
}
}
}
Java
код в порядке