Пользовательский ViewPager не отображается

Я пытаюсь определить пользовательское представление, которое расширяет ViewPager.
Сначала я определил 2 xml:
view_media_slider_item.xml

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout
        xmlns:android = "http://schemas.android.com/apk/res/android"
        android:id = "@+id/linearLayout"
        android:layout_width = "300dp"
        android:layout_height = "300dp"
        android:orientation = "vertical"
        android:background = "@color/colorAccent"
        android:gravity = "center">

    <ImageView
            android:id = "@+id/image"
            android:layout_width = "200dp"
            android:layout_height = "200dp"
            android:src = "@drawable/science"/>

    <TextView
            android:padding = "16dp"
            android:id = "@+id/text"
            android:textStyle = "bold"
            android:textSize = "30sp"
            android:text = "Title Here"
            android:textColor = "#fff"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"/>

</LinearLayout>

view_media_slider.xml

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

    <androidx.viewpager.widget.ViewPager
            android:id = "@+id/viewPager"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent">

    </androidx.viewpager.widget.ViewPager>

</LinearLayout>

Затем я определил адаптер, который расширяет PagerAdapter, а также жестко закодировал некоторые данные в адаптере.

class MediaSliderViewAdapter: PagerAdapter() {

    private val TAG = MediaSliderViewAdapter::class.simpleName

    private var mediaList = listOf(
        Pair(1, "ha"),
        Pair(2, "hsadfa"),
        Pair(1, "hasad"),
        Pair(1, "hasdaf"),
        Pair(1, "haqw12"),
        Pair(1, "hadsf"),
        Pair(1, "ha23"),
        Pair(1, "hadsaxc")
    )

    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        return view == `object`
    }

    override fun getCount(): Int {
        Log.d(TAG, mediaList.size.toString())
        return mediaList.size
    }

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val inflater = (context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)) as LayoutInflater
        val rootView = inflater.inflate(R.layout.view_media_slider_item, container, false)
        rootView.findViewById<ImageView>(R.id.image).setImageResource(R.drawable.science)
        rootView.findViewById<TextView>(R.id.text).text = mediaList[position].second
        container.addView(rootView)
        return rootView
    }

    fun setMediaData(mediaData: List<Pair<Int, String>>) {
        mediaList = mediaData
        notifyDataSetChanged()
    }

Вот пользовательское представление, которое я хочу создать, с именем MediaSliderView:

class MediaSliderView : ViewPager {
    @JvmOverloads
    constructor(
        context: Context,
        attrs: AttributeSet? = null
    ) : super(context, attrs)

    private val viewPager: ViewPager
    private val mediaSliderViewAdapter = MediaSliderViewAdapter()

    init {
        View.inflate(context, R.layout.view_media_slider, this) // inflate first before set below attrs, otherwise NPE
        viewPager = findViewById(R.id.viewPager)
        viewPager.adapter = mediaSliderViewAdapter
    }

    fun setMedia(urls: List<Pair<Int, String>>) {
        mediaSliderViewAdapter.setMediaData(urls)
    }
}

Наконец, я поместил это пользовательское представление во фрагмент с именем view_search.xml, и пейджер представления по какой-то причине не показывает никаких данных.

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
              android:orientation = "vertical"
              android:layout_width = "match_parent"
              android:layout_height = "match_parent"
              android:layout_centerHorizontal = "true">

    <io.keyu.urekalite.view.MediaSliderView
            android:background = "@color/colorPrimary"
            android:layout_width = "500dp"
            android:layout_height = "500dp">

    </io.keyu.urekalite.view.MediaSliderView>

</LinearLayout>

Данные уже инициализированы в адаптере, поэтому я думаю, что он должен хоть что-то показывать, но не показывает.

1
0
799
1

Ответы 1

Вы можете создать фрагмент класса для вашего view_media_slider_item.xml и используйте FragmentPagerAdapter вместо PagerAdapter

viewPager.setAdapter(new FragmentPagerAdapter() {
    @Override
    Fragment getItem(position: Int) {
        return //Fragment class of view_media_slider_item
    }

    @Override
    int getCount() {
       return 1
    }
})

Спасибо за ответ! Я чувствую, что это немного чересчур, чтобы сделать ImageView как Fragment. Есть ли конкретная причина, по которой FragmentPagerAdapter решит проблему с пустыми данными?

zluan 24.02.2019 23:30

Другие вопросы по теме