首页 > 解决方案 > kotlin:在类似应用程序的火种中添加cardstackview时片段中的错误

问题描述

我正在关注本教程,了解如何使用 Kotlin 制作类似 Tinder 的应用程序并使用第三个库 CardStackView: https ://www.simplifiedcoding.net/tinder-like-swipe-cards-android/

但是,在我的情况下,显示如下错误:

Attempt to invoke virtual method 'void com.yuyakaido.android.cardstackview.CardStackView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
        at com.gearsrun.stackviewapplication.UI.Home.HomePageFragment.onCreateView(HomePageFragment.kt:36)

HomeUserAdapter.kt

package com.gearsrun.stackviewapplication.HomeUserClass

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.gearsrun.stackviewapplication.R
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.user_card.view.*

class HomeUserAdapter:RecyclerView.Adapter<HomeUserAdapter.HomeUserViewHolder>() {

   private var homeUserList:List<HomeUserItem>?=null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeUserViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.user_card,parent,false)
        return HomeUserViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: HomeUserViewHolder, position: Int) {
        val homeUserList = generateUser()
        val currentItem = homeUserList[position]
        Picasso.get().load(currentItem.user_img).into(holder.user_img)
        holder.user_name.text = currentItem.user_name
        holder.medal_num.text = currentItem.medal_num
        holder.id_num.text = currentItem.userId
        holder.user_intro.text = currentItem.user_intro
        holder.user_give_num.text = currentItem.user_give_num
        holder.user_receive_num.text = currentItem.user_receive_num

    }

    private fun generateUser(): ArrayList<HomeUserItem> {
        val list = ArrayList<HomeUserItem>()
        list.add(
            HomeUserItem(
                "https://i.pinimg.com/236x/8c/64/03/8c6403cc892231f15a6845e00d7433a9.jpg",
                "Maria",
                "200",
                "510uu",
                "I am from USA ,I am an engineer ,I hope to make the world a better place",
                "500",
                "100")
        )

       
        )





        return list

    }

    override fun getItemCount(): Int {
       return  homeUserList!!.size
    }

    class HomeUserViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {
        val user_img : ImageView = itemView.user_img
        val user_name : TextView = itemView.user_name
        val medal_num : TextView = itemView.medal_num
        val id_num : TextView = itemView.id_num
        val user_intro : TextView = itemView.user_intro
        val user_give_num : TextView = itemView.user_give_num
        val user_receive_num : TextView = itemView.user_receive_num

    }
}

主页Fragment.kt

package com.gearsrun.stackviewapplication.UI.Home

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.LinearInterpolator
import androidx.recyclerview.widget.DefaultItemAnimator
import com.gearsrun.stackviewapplication.HomeUserClass.HomeUserAdapter
import com.gearsrun.stackviewapplication.HomeUserClass.HomeUserItem
import com.gearsrun.stackviewapplication.R
import com.yuyakaido.android.cardstackview.CardStackLayoutManager
import com.yuyakaido.android.cardstackview.CardStackListener
import com.yuyakaido.android.cardstackview.Direction
import com.yuyakaido.android.cardstackview.SwipeableMethod
import kotlinx.android.synthetic.main.fragment_home_page.*


class HomePageFragment : Fragment(),CardStackListener {
    private lateinit var layoutManager: CardStackLayoutManager
    private val adapter = HomeUserAdapter()
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val v = inflater.inflate(R.layout.fragment_home_page, container, false)


       // v.rv_UserHome.layoutManager = LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false)

       layoutManager = CardStackLayoutManager(context,this).apply {
           setSwipeableMethod(SwipeableMethod.AutomaticAndManual)
           setOverlayInterpolator(LinearInterpolator())
       }
        stack_view.layoutManager = layoutManager
        stack_view.adapter = adapter
        stack_view.itemAnimator.apply {
            if(this is DefaultItemAnimator){
                supportsChangeAnimations = false
            }
        }


        return v
    }



    override fun onCardDragging(direction: Direction?, ratio: Float) {
        TODO("Not yet implemented")
    }

    override fun onCardSwiped(direction: Direction?) {
        TODO("Not yet implemented")
    }

    override fun onCardRewound() {
        TODO("Not yet implemented")
    }

    override fun onCardCanceled() {
        TODO("Not yet implemented")
    }

    override fun onCardAppeared(view: View?, position: Int) {
        TODO("Not yet implemented")
    }

    override fun onCardDisappeared(view: View?, position: Int) {
        TODO("Not yet implemented")
    }


}

你能帮我看看我的代码吗?

非常感谢您!

标签: kotlin

解决方案


将所有这些layoutManagerstackView内容从onCreateto 移到,onViewCreated因为在onCreate您的视图期间尚未​​创建,并且在onViewCreated.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        layoutManager = CardStackLayoutManager(context,this).apply {
           setSwipeableMethod(SwipeableMethod.AutomaticAndManual)
           setOverlayInterpolator(LinearInterpolator())
       }
        stack_view.layoutManager = layoutManager
        stack_view.adapter = adapter
        stack_view.itemAnimator.apply {
            if(this is DefaultItemAnimator){
                supportsChangeAnimations = false
            }
        }
}

或者你可以参考这里


推荐阅读