Как сделать разные взгляды RecyclerView как бесконечный цикл? - PullRequest
0 голосов
/ 31 октября 2018

Я искал, чтобы создать recyclerview Карусель, чтобы первый элемент снова появлялся, когда последний элемент был виден, и продолжал показываться снова и снова. Теперь я знаю, что на этот ответ уже ответили здесь и здесь , но оба эти ответа не решили мою проблему. Хотя количество предметов увеличилось, но фрагмент, который является предметом в рециркуляции, ничего не показывает.

Я раздуваю fragments как предметы для RecyclerView, вложенного в ViewPager. Принятые ответы не смогли решить мою проблему.

Код: RecyclerViewAdapterClass

fun initialize(scrollableData: ArrayList<ScrollableData>, activity: AppCompatActivity) {
        this.scrollableData = scrollableData
        this.activity = activity
    }

    override fun getItemCount() = scrollableData.size

    override fun getItemViewType(position: Int): Int {
        return scrollableData[position].index
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseHolder {

        when (viewType) {
            ScrollableItems.ABC -> {
                val view = parent.inflate(R.layout.view_module_abc, false)
                return ABCViewHolder(view, abcPresenterImpl, activity)
            }

            ScrollableItems.DEF -> {
                val view = parent.inflate(R.layout.view_module_def, false)
                return DEFViewHolder(view, defControlPresenter, activity)
            }

            else -> {
                val view = parent.inflate(R.layout.view_module_ghi, false)
                return GHIViewHolder(view, GHIModulePresenter, activity)
            }
        }
    }

    override fun onBindViewHolder(holder: BaseHolder, position: Int) {
        holder.bindView()
    }

и HomeActivity # setupRecyclerView (...)

private fun setupRecyclerView(scrollableDataList: ArrayList<ScrollableData>) {
        linearLayoutManager = CustomLinearLayoutManager(applicationContext, LinearLayout.HORIZONTAL, !DeviceConfig.instance!!.isRegularDevice)
        recycler_view.layoutManager = linearLayoutManager
        recycler_view.adapter = mainScreenAdapter

        mainScreenAdapter.initialize(scrollableDataList, this)
        recycler_view.setHasFixedSize(true);
        GravityPagerSnapHelper(if (DeviceConfig.instance!!.isRegularDevice) Gravity.START else Gravity.END, true, this).attachToRecyclerView(recycler_view)
        recyclerViewScrollListener()
    }

и CustomLinearLayoutManager

class CustomLinearLayoutManager(context: Context, orientation: Int, reverseLayout: Boolean)
    : LinearLayoutManager(context, orientation, reverseLayout) {

    var isScrollEnabled = true

    override fun canScrollHorizontally(): Boolean {
        return isScrollEnabled && super.canScrollHorizontally()
    }

    override fun canScrollVertically(): Boolean {
        return isScrollEnabled && super.canScrollVertically()
    }
}

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 05 ноября 2018

Итак, после тщательного поиска, нашли это решение.

Так вот что я сделал

RecyclerViewAdapterClass

  fun initialize(scrollableData: ArrayList<ScrollableData>, activity: AppCompatActivity) {
            this.scrollableData = scrollableData
            this.activity = activity
            list = /*listOf(scrollableData.last()) +*/ scrollableData + listOf(scrollableData.first()) //this is very important
            }
    ...
      override fun getItemViewType(position: Int): Int {
        return list[position %  list.size].index
    }

HomeActivity # setupRecyclerView (...)

mainScreenAdapter.itemCount.takeIf { it > 1 }
                ?.apply {
                    onScrollListener = OnScrollListener(
                            mainScreenAdapter.itemCount,
                            linearLayoutManager
                    ) {
                       //some code here
                    }
                    recycler_view.addOnScrollListener(onScrollListener)
                    recycler_view.scrollToPosition(0)
                }

OnScrollListener

internal class OnScrollListener(val itemCount: Int, val layoutManager: LinearLayoutManager,
                                    val stateChanged: (Int) -> Unit) : RecyclerView.OnScrollListener() {
        var isLooping = false
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView!!, dx, dy)
            val firstItemVisible = layoutManager.findFirstCompletelyVisibleItemPosition()

            if (firstItemVisible > 0 && firstItemVisible % (itemCount - 1) == 0) {
                // When position reaches end of the list, it sho    uld go back to the beginning
                isLooping = true
                recyclerView?.scrollToPosition(0)
            } /*else if (firstItemVisible == 0) {
                // When position reaches beginning of the list, it should go back to the end
                recyclerView?.scrollToPosition(itemCount-1)
            }*/
        }

        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView!!, newState)
            var loop = newState
            if (isLooping) {
                loop = 100
                isLooping = false
            }
            stateChanged(loop)
        }
    }

Ссылка: https://github.com/tomoima525/CirculerAutoScrollingRecyclerView

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