Почему мой фрагмент на вкладке в нижней части навигации не отображается сразу? - PullRequest
0 голосов
/ 18 июня 2019

Вот упрощенная версия моего проекта.Допустим, у меня есть text view выше recycler view, который находится внутри nested scroll view, как на изображении ниже

enter image description here

Вот 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.В самый первый раз, когда я нажимаю на эту вкладку (после того, как я полностью закрываю приложение), поведение второго виджета выглядит так:

  1. text view немедленно появится
  2. тогда progress bar покажет (выборка данных с сервера)
  3. 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 код в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...