Abraham Mathew
Abraham Mathew

Reputation: 2146

IllegalStateException: TabLayoutMediator attached before ViewPager2 has an adapter

fragment_news_details

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data class="NewsDetailsBinding">

        <variable
            name="adapter"
            type="com.abc.xyz.base.BaseAdapter" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout 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"
        tools:context=".news.NewsDetailsFragment">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/viewPagerGuideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.4" />

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/imageViewPager"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:adapter="@{adapter}"
            app:layout_constraintBottom_toBottomOf="@id/viewPagerGuideline"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/dotsTab"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:background="@color/transparent"
            app:layout_constraintBottom_toBottomOf="@id/imageViewPager"
            app:layout_constraintEnd_toEndOf="@+id/imageViewPager"
            app:layout_constraintStart_toStartOf="@+id/imageViewPager"
            app:tabBackground="@drawable/dot_selector"
            app:tabGravity="center"
            app:tabIndicatorHeight="0dp" />

        <TextView
            android:id="@+id/descriptionTitleTV"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:textColor="@color/textColorPrimary"
            android:textSize="@dimen/text_size_20"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/viewPagerGuideline"
            tools:text="Fresh snow at Dunga" />

        <TextView
            android:id="@+id/descriptionTV"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:textColor="@color/textColorSecondary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/descriptionTitleTV"
            tools:text="Lorem ipsum dolor sit." />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout><?xml version="1.0" encoding="utf-8"?>

NewsDetailsFragment

class NewsDetailsFragment : Fragment() {
    lateinit var binding: NewsDetailsBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = inflater.bind(R.layout.fragment_news_details, container)
        return binding.root
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val templist = ArrayList<String>().apply {
            add("https://picsum.photos/id/237/200/300")
            add("https://picsum.photos/seed/picsum/200/300")
            add("https://picsum.photos/id/1002/300/400")
            add("https://picsum.photos/id/237/200/300")
        }
        binding.adapter =
            BaseAdapter(templist, R.layout.item_news_image, ::NewsImageViewHolder)
        if (binding.adapter != null)
            TabLayoutMediator(binding.dotsTab, binding.imageViewPager) { tab, position ->
                tab.icon = ContextCompat.getDrawable(requireContext(), R.drawable.anim_add_star)
            }.attach()

    }


    inner class NewsImageViewHolder(itemBinding: NewsImageItemBinding) :
        BaseViewHolder<String, NewsImageItemBinding>(itemBinding) {

    }
}

in on activity created its throwing error TabLayoutMediator attached before ViewPager2 has an adapter. I tried adding the adapter above and below the TabloutMediatorI().attach(), does not work in both cases.What I need is to show dots indicator using tabslayout .I am new using ViewPager 2 ,Any help would be appreciated.Thanks.

Upvotes: 0

Views: 4936

Answers (1)

Alexandru Gabor
Alexandru Gabor

Reputation: 46

ViewPager doesn't have an adapter attribute, so android:adapter="@{adapter}" doesn't set the adapter on the ViewPager.

Instead, you can get the view pager from binding and set the adapter in your fragment like this: binding.imageViewPager.adapter = BaseAdapter(templist, R.layout.item_news_image, ::NewsImageViewHolder)

Upvotes: 3

Related Questions