Giter Club home page Giter Club logo

cardslider's Introduction

Hi 👋, I'm Islam Khaled

A senior Android Engineer from Egypt

islamkhsh islamkhsh islamkhsh

📌 About Me

📬 Connect with me

islam.khaled50@gmail.com islamkhsh islam-khaled @islam.kh.sh

Languages and Tools

android firebase git java kotlin realm sqlite

StackOverflow profile

islamkhsh

islamkhsh

islamkhsh

cardslider's People

Contributors

alanbastos avatar islamkhsh avatar kosaanta avatar mahmoudmabrok avatar tarekkma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cardslider's Issues

Indicator bug

If you try to smooth drag scrool to any position and dont release your finger, then indicator will stuck at previous position

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is also present at [androidx.core:core:1.2.0-rc01] AndroidManifest.xml:24:18-86 value=(androidx.core.app.CoreComponentFactory). Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:26:5-412:19 to override.

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.2.0-rc01] AndroidManifest.xml:24:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to element at AndroidManifest.xml:26:5-412:19 to override.

Jcenter

jcenter is shutdown please migrate to maven central

Set other card background

Hello! Is there a way to set other pages background color?
My main color is #242242, the others have #302d57.

Unable to customize CardSliderIndicator

I want to change the indicator, I have changed it in sample app but unable to change it in my project and can't extend CardSliderIndicator class. Anybody had done that kindly let me know how can I do it.

onPageSelected listener doesn’t trigger when I back to position 0

Here is my code

class Adapter : CardSliderAdapter<Adapter.ItemViewHolder>() {

    val items = ArrayList<Int>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        return ItemViewHolder(
            LayoutInflater.from(parent.context).inflate(
                R.layout.item,
                parent,
                false
            )
        )
    }

    override fun getItemCount(): Int = items.size

    override fun bindVH(holder: ItemViewHolder, position: Int) {
        holder.bind(position)
    }

    inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(position: Int) {
            itemView.tv.text = "$position"
            itemView.imageView.setImageResource(items[position])
        }
    }
}

MainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val adapter = Adapter()
        viewPager.adapter = adapter

        adapter.items.add(R.drawable.frame_1)
        adapter.items.add(R.drawable.frame_2)
        adapter.items.add(R.drawable.frame_3)
        adapter.items.add(R.drawable.frame_4)
        adapter.notifyDataSetChanged()

        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                Log.d("myLogs", "onPageSelected $position")
            }
        })
    }
}

notifyDataSetChanged() not update the data

Hello,
First, thanks for this amazing lib, you saved me a ton of time!
I started to implement it, and I noticed that when I call notifyDataSetChanged on the adapter, the list is not refreshed, is it normal?
Thanks !

Indicator animation

When using hidden indicators and start swiping towards the first page the animation is not correct. Then when you swipe to the end the new dots (the grey ones) are not circles they are quarter of a circle.

When swipe to first position the onPageSelected is not called

If you swipe to position 0 the onPageSelected is not called thus the indicator doesn't select the first dot. This happens for the first page. e.g. If you setup the adapter and set viewPage.currentItem = 2 when you swipe to position 2 the onPageSelected is not called for this position and the indicator doesn't change.

Video not Show

When i used videoview in item layout , video's sound play but video not show , i written same code in other place without CardSilder it's working so can you help please

add ability to have each item seperately

Now the library has (ViewPager, Adapter, Indicator) if they can operate separately & stand-alone what about ship each one as sperate
i.e as a user for the library he can get only indicators as an example.

IndexOutOfBoundISuue

I want to reload the data with new set of variable but the when I notifythedataset then this issue occurs.please help

Is this Library work on Android 5

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.github.islamkhsh.CardSliderViewPager.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference

indicator didn't show!

Hello, thank you for your nice lib, but I am having a problem that is indicator didn't show.
here is my snippet code.

            <com.github.islamkhsh.CardSliderViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="@dimen/_150sdp"
                android:layout_marginTop="10dp"
                app:auto_slide_time="5"
                app:cardSlider_indicator="@+id/indicator"
                app:cardSlider_otherPagesWidth="24dp"
                app:cardSlider_pageMargin="12dp"
                app:cardSlider_smallScaleFactor="1" />

            <com.github.islamkhsh.CardSliderIndicator
                android:id="@+id/indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="@dimen/_8sdp"
                app:defaultIndicator="@drawable/ic_slider_unselected"
                app:indicatorsToShow="3"
                app:selectedIndicator="@drawable/ic_slider_selected" />

i think there is nothing to do in java code, right?

Using card slider adapter with live data

Hi,
Thanks for the repo. It's very useful.
Recently I have migrated my app to MVVM.
One of my CardSliderAdapter use livedata as the source. Is there any way to add items to Adapter after creating/instantiating the adapter object like in paged recycler adapter?

Switching cards bug

My implementation of the library has "menu" icon (on each card) which shows list menu on click.
On Android API 23/24/25 there is a bug shown in the picture. Slider slides between two cards (to the right):
dashboard_cardslider

Is there any clue why this happens on older Android devices?

Crashes due to CardSliderTransformer#scalingEquation

In some cases CardSliderTransformer#scalingEquation doesn't return valid Float.

// gives position NaN in some cases
override fun transformPage(page: View, position: Float)

The following line throws an error when trying to assign NaN as elevation.

// This will be during transformation
(page as CardView).cardElevation =
       scalingEquation(viewPager.minShadow, viewPager.baseShadow, absPosition)

private fun scalingEquation(minValue: Float, maxValue: Float, absPosition: Float) =
        (minValue - maxValue) * absPosition + maxValue

Stacktrace as per the Logcat

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.taglr.debug, PID: 5855
    java.lang.IllegalArgumentException: Cannot set 'elevation' to Float.NaN
        at android.view.View.sanitizeFloatPropertyValue(View.java:17041)
        at android.view.View.sanitizeFloatPropertyValue(View.java:17015)
        at android.view.View.setElevation(View.java:17137)
        at androidx.cardview.widget.CardViewApi21Impl.setElevation(CardViewApi21Impl.java:78)
        at androidx.cardview.widget.CardView.setCardElevation(CardView.java:376)
        at com.github.islamkhsh.CardSliderTransformer.transformPage(CardSliderTransformer.kt:40)
        at androidx.viewpager.widget.ViewPager.onPageScrolled(ViewPager.java:1915)
        at androidx.viewpager.widget.ViewPager.pageScrolled(ViewPager.java:1842)
        at androidx.viewpager.widget.ViewPager.scrollToItem(ViewPager.java:694)
        at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1786)
        at android.view.View.layout(View.java:22509)
        at android.view.ViewGroup.layout(ViewGroup.java:7190)
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
        at android.view.View.layout(View.java:22509)
        at android.view.ViewGroup.layout(ViewGroup.java:7190)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:22509)
        at android.view.ViewGroup.layout(ViewGroup.java:7190)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins(RecyclerView.java:9555)
        at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:690)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4115)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3521)
        at android.view.View.measure(View.java:25056)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:25056)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7745)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.cardview.widget.CardView.onMeasure(CardView.java:260)
        at android.view.View.measure(View.java:25056)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.measureChildWithMargins(RecyclerView.java:9352)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1653)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1391)
        at androidx.recyclerview.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1128)
        at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:1855)
        at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5281)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:988)
        at android.view.Choreographer.doCallbacks(Choreographer.java:765)
        at android.view.Choreographer.doFrame(Choreographer.java:697)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:967)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7285)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Transition between pages is not smooth. It is fast and laggy

I have integrated the CardSlider successfully and it is working fine. But, i have a few requirements that seems missing or may be I'm doing it wrong.

  • The transition between pages is very fast. Is there any parameter which can solve this problem.
  • Screen lags when transition happen between pages, which looks very bad. How can i solve this ?
  • Can we set transition duration ? I'm not talking about the time between swipe.

Any help would be appreciated :)

ViewPager2

Hello. I really liked the functionality of your library, but there is one thing, it uses the first ViewPager. Are you planning to upgrade to ViewPager2? Thanks

ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
        at com.github.islamkhsh.CardSliderAdapter.instantiateItem(CardSliderAdapter.kt:50)
        at com.duolingo.open.rtlviewpager.DelegatingPagerAdapter.instantiateItem(DelegatingPagerAdapter.java:53)
        at com.duolingo.open.rtlviewpager.RtlViewPager$ReversingAdapter.instantiateItem(RtlViewPager.java:338)
        at androidx.viewpager.widget.ViewPager.addNewItem(ViewPager.java:1010)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1158)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631)
        at androidx.viewpager.widget.ViewPager.dataSetChanged(ViewPager.java:1086)
        at androidx.viewpager.widget.ViewPager$PagerObserver.onChanged(ViewPager.java:3097)
        at androidx.viewpager.widget.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:291)
        at com.duolingo.open.rtlviewpager.DelegatingPagerAdapter.superNotifyDataSetChanged(DelegatingPagerAdapter.java:148)
        at com.duolingo.open.rtlviewpager.DelegatingPagerAdapter.access$100(DelegatingPagerAdapter.java:27)
        at com.duolingo.open.rtlviewpager.DelegatingPagerAdapter$MyDataSetObserver.onChanged(DelegatingPagerAdapter.java:162)
        at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
        at androidx.viewpager.widget.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:294)
        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)
        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:149)
        at androidx.lifecycle.LiveData.setValue(LiveData.java:307)
        at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
        at androidx.lifecycle.LiveData$1.run(LiveData.java:91)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Fatal Exception: java.lang.IndexOutOfBoundsException

The callback method onPageSelected receives a position greater than the list of elements.

CardSlider version:
implementation 'com.github.IslamKhSh:CardSlider:1.0.1'

API level:
Android 6, 9

Error log:

Fatal Exception: java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
       at java.util.ArrayList.get(ArrayList.java:437)
       at com.example.ui.quiz.info.InfoViewModel$init$1.onPageSelected(InfoViewModel.java:47)
       at com.github.islamkhsh.viewpager2.CompositeOnPageChangeCallback.onPageSelected(CompositeOnPageChangeCallback.java:72)
       at com.github.islamkhsh.viewpager2.CompositeOnPageChangeCallback.onPageSelected(CompositeOnPageChangeCallback.java:72)
       at com.github.islamkhsh.viewpager2.ScrollEventAdapter.dispatchSelected(ScrollEventAdapter.java:386)
       at com.github.islamkhsh.viewpager2.ScrollEventAdapter.onScrolled(ScrollEventAdapter.java:176)
       at androidx.recyclerview.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:5173)
       at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5338)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:988)
       at android.view.Choreographer.doCallbacks(Choreographer.java:765)
       at android.view.Choreographer.doFrame(Choreographer.java:697)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:967)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7156)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Sample code:

class PrizeAdapter1 @Inject constructor() : CardSliderAdapter<PrizeAdapter1.PrizeViewHolder>() {

    val items = ArrayList<Prize>()
    private val backgrounds = arrayListOf(
        R.drawable.frame_1,
        R.drawable.frame_2,
        R.drawable.frame_3,
        R.drawable.frame_3
    )

    override fun bindVH(holder: PrizeViewHolder, position: Int) {
        holder.bind(items[position], backgrounds[position % backgrounds.size])
    }

    override fun getItemCount(): Int = items.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PrizeViewHolder {
        return PrizeViewHolder(
            ViewholderQuizPrize1Binding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
        )
    }

    class PrizeViewHolder(val binding: ViewholderQuizPrize1Binding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(item: Prize, background: Int) {
            binding.item = item
            binding.ivBackground.setImageResource(background)
        }
    }
}
@PerController
class InfoViewModel @Inject constructor() : BaseViewModel<InfoCallback>() {

    @Inject
    lateinit var mPrizesAdapter: PrizeAdapter1

    @Inject
    lateinit var mCategoriesAdapter: CategoryAdapter

    @Inject
    lateinit var mTopMembersAdapter: TopMemberAdapter

    @Inject
    lateinit var mHistoryAdapter: HistoryAdapter

    lateinit var onPrizeChangeListener: ViewPager2.OnPageChangeCallback
    val shouldShowHistory = ObservableBoolean(true)
    val havePointsText = ObservableField<String>()
    val fromPointsPerDayText = ObservableField<String>()
    val shouldShowContent = ObservableBoolean(false)
    var isDirty = false
    var mLoadGameStateDisposable: Disposable? = null

    override fun init(args: Bundle) {
        onPrizeChangeListener = object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                if (isDirty) {
                    val prize = mPrizesAdapter.items[position]

                    loadGameState(prize.index)

                    if (prize.index == 0 || prize.index == 1)
                        fromPointsPerDayText.set(
                            mContext.getString(
                                R.string.from_n_points_per_day,
                                mDecimalFormat.format(prize.maxScore)
                            )
                        )
                    else
                        fromPointsPerDayText.set(
                            mContext.getString(
                                R.string.out_of_n_available,
                                mDecimalFormat.format(prize.maxScore)
                            )
                        )
                }

                isDirty = true
            }
        }

        mCategoriesAdapter.listener = object : CategoryAdapter.Listener {
            override fun onScrollToPosition(position: Int) {
                mCallback.setCategoriesCurrentPosition(position)
            }

            override fun onPlayClick() {
                mCallback.openQuestions()
            }
        }

        mCallback.bindPrizes(mPrizesAdapter)
        mCallback.bindCategories(mCategoriesAdapter)
        mCallback.bindTopMembers(mTopMembersAdapter)
        mCallback.bindHistory(mHistoryAdapter)
    }

    override fun onAttach() {
        super.onAttach()
        loadQuizInfo(false)
    }

    @SuppressLint("CheckResult")
    fun loadQuizInfo(getNewData: Boolean) {
        mLoadGameStateDisposable?.dispose()

        mRepository.getQuizInfoAggregated(
            mPreferencesHelper.myPhoneNumber,
            mPreferencesHelper.subAccount,
            mPreferencesHelper.locale,
            getNewData
        )
            .compose(RxUtil.applyDefaults(this))
            .subscribe({
                handleQuizInfoResponse(it)
            }, {
                handleError(it)
            })
    }

    @SuppressLint("CheckResult")
    fun loadGameState(topType: Int) {
        mLoadGameStateDisposable?.dispose()

        mLoadGameStateDisposable = mNetworkHelper.getQuizGameState(
            mPreferencesHelper.myPhoneNumber,
            mPreferencesHelper.subAccount,
            topType
        )
            .compose(RxUtil.applySchedulers())
            .subscribe({ response ->
                mTopMembersAdapter.items.clear()
                mTopMembersAdapter.items.addAll(response.top)
                mTopMembersAdapter.notifyDataSetChanged()
            }, {
                handleError(it)
            })
    }

    private fun handleQuizInfoResponse(response: InfoAggregated) {
        shouldShowContent.set(true)
        havePointsText.set(
            mContext.getString(
                R.string.i_have_n_points,
                mDecimalFormat.format(response.gameStateResult.score)
            )
        )

        for (prize in response.prizeResult.prizes)
            if (prize.index == response.stateResult.gameLevel) {
                fromPointsPerDayText.set(
                    mContext.getString(
                        R.string.from_n_points_per_day,
                        mDecimalFormat.format(prize.maxScore)
                    )
                )
                break
            }

        mPrizesAdapter.items.clear()
        mPrizesAdapter.items.addAll(response.prizeResult.prizes)
        mPrizesAdapter.notifyDataSetChanged()
        mCallback.removeOnPrizeChangeListener(onPrizeChangeListener)
        mCallback.setPrizesCurrentPosition(0)
        mCallback.setOnPrizeChangeListener(onPrizeChangeListener)

        mCategoriesAdapter.items.clear()
        mCategoriesAdapter.items.addAll(response.levelResult.levels)
        mCategoriesAdapter.notifyDataSetChanged()
        mCallback.setCategoriesCurrentPosition(Integer.MAX_VALUE / 2)

        mTopMembersAdapter.items.clear()
        mTopMembersAdapter.items.addAll(response.gameStateResult.top)
        mTopMembersAdapter.notifyDataSetChanged()

        mHistoryAdapter.items.clear()
        mHistoryAdapter.items.addAll(response.gameStateResult.history)
        mHistoryAdapter.notifyDataSetChanged()
    }

    fun onMoreDetailsButtonClick() {
        mCallback.openParticipateRules()
    }

    fun onShowHistoryClick(toggle: Boolean) {
        shouldShowHistory.set(toggle)

        if (toggle)
            mCallback.scrollToBottom()
    }

    fun onCloseClick() {
        mCallback.closeController()
    }
}
interface InfoCallback : BaseViewModel.BaseCallback {
    fun openParticipateRules()
    fun bindPrizes(adapter: PrizeAdapter1)
    fun bindCategories(adapter: CategoryAdapter)
    fun bindTopMembers(adapter: TopMemberAdapter)
    fun bindHistory(adapter: HistoryAdapter)
    fun setOnPrizeChangeListener(listener: ViewPager2.OnPageChangeCallback)
    fun removeOnPrizeChangeListener(listener: ViewPager2.OnPageChangeCallback)
    fun setCategoriesCurrentPosition(position: Int)
    fun setPrizesCurrentPosition(position: Int)
    fun openQuestions()
    fun closeController()
    fun scrollToBottom()
}
class InfoController : BaseController(), InfoCallback {

    @Inject
    lateinit var mViewModel: InfoViewModel
    lateinit var binding: ControllerQuizInfoBinding

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View {
        BaseApplication.getComponent().controllerComponent(ControllerModule(activity)).inject(this)
        binding = ControllerQuizInfoBinding.inflate(inflater, container, false)
        binding.viewmodel = mViewModel
        mViewModel.setCallback(this, args)
        binding.swipeLayout.setColorSchemeResources(R.color.colorPrimary, R.color.black)

        return binding.root
    }

    override fun openParticipateRules() {
        router.pushController(
            RouterTransaction.with(ParticipateRulesController())
                .pushChangeHandler(HorizontalChangeHandler())
                .popChangeHandler(HorizontalChangeHandler())
        )
    }

    override fun openQuestions() {
        router.pushController(
            RouterTransaction.with(QuestionController())
                .pushChangeHandler(HorizontalChangeHandler())
                .popChangeHandler(HorizontalChangeHandler())
        )
    }

    override fun bindPrizes(adapter: PrizeAdapter1) {
        binding.vpPrizes.adapter = adapter
    }

    override fun bindCategories(adapter: CategoryAdapter) {
        binding.vpCategories.adapter = adapter
    }

    override fun bindTopMembers(adapter: TopMemberAdapter) {
        binding.rvTopMembers.layoutManager = LinearLayoutManager(activity)
        binding.rvTopMembers.adapter = adapter
    }

    override fun bindHistory(adapter: HistoryAdapter) {
        binding.rvHistory.layoutManager = LinearLayoutManager(activity)
        binding.rvHistory.adapter = adapter
    }

    override fun setOnPrizeChangeListener(listener: ViewPager2.OnPageChangeCallback) {
        binding.vpPrizes.registerOnPageChangeCallback(listener)
    }

    override fun removeOnPrizeChangeListener(listener: ViewPager2.OnPageChangeCallback) {
        binding.vpPrizes.unregisterOnPageChangeCallback(listener)
    }

    override fun setCategoriesCurrentPosition(position: Int) {
        binding.vpCategories.currentItem = position
    }

    override fun setPrizesCurrentPosition(position: Int) {
        binding.vpPrizes.currentItem = position
    }

    override fun closeController() {
        router.handleBack()
    }

    override fun scrollToBottom() {
        binding.root.postDelayed({
            binding.nestedScrollView.fullScroll(View.FOCUS_DOWN)
        }, 30)
    }

    override fun onChangeStarted(
        changeHandler: ControllerChangeHandler,
        changeType: ControllerChangeType
    ) {
        super.onChangeStarted(changeHandler, changeType)
        if (!changeType.isEnter) {
            mViewModel.onDetach()
        } else {
            binding.root.postDelayed({
                mTabStateManager.setTab(TabStateManager.Tabs.QUIZ_INFO_SCREEN)
                mViewModel.onAttach()
            }, 30)
        }
    }

    override fun showMessage(message: String, vararg duration: Int) {
        showToast(binding.root, message)
    }

    override fun showMessage(message: Int, vararg duration: Int) {
        showToast(binding.root, message)
    }
}

Surface is not valid.

When phone is locked and slider autosliding is on, logcat prints "E/ViewRootImpl@b0cfb78[MainActivity]: Surface is not valid." repeatedly.
Some fix that I use is cardSliderViewPager.setAutoSlideTime(-1); onPause state calling and then return back time onResume

Execution failed

After I cloned the repo then run the sample i got next error.
I am using Arctic fox.

Execution failed for task ':cardslider:compileDebugJavaWithJavac'.
> javax/xml/bind/JAXBException

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.