Search code examples
androidkotlinabstract-class

I am getting cannot create instance of abstract class in kotlin warning?


I am a new to Kotlin. I have two classes, one adapter and one fragment. When I want to call the adapter class in fragment I am getting the following warning: cannot create an instance of the abstract class in Kotlin.

Below my fragment where I am getting the warning

class FavouriteExercisesFragment : BaseMvpFragment(), FavoriteExerciseView {

    var adapter: FavoriteExerciseAdapter = FavoriteExerciseAdapter()
   // cannot create instance of abstract class in kotlin

Below abstract adapter class

class FavouriteExercisesFragment : BaseMvpFragment(), FavoriteExerciseView {

    var adapter: FavoriteExerciseAdapter = FavoriteExerciseAdapter()
    val presenter: FavoriteExercisePresenter = FavoriteExercisePresenter(this)

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        rootView = inflater.inflate(R.layout.fragment_favorite_ex, container, false)
        return rootView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initToolbar()
        initList()
        presenter.getFavoriteExercise()
    }

    private fun initList() {
        rvExercise.layoutManager = LinearLayoutManager(context)
        rvExercise.adapter = adapter
        val helper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT) {
            override fun onMove(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
                adapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
                return true
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                val position = viewHolder.adapterPosition
                val item = adapter.data[position]
                adapter.onItemDismiss(viewHolder.adapterPosition)
                presenter.deleteFromFavorite(item, position)
                showEmptyData(adapter.data.isEmpty())

            }
        })
        rvExercise.addItemDecoration(object : RecyclerView.ItemDecoration() {
            override fun getItemOffsets(outRect: Rect, view: View?, parent: RecyclerView, state: RecyclerView.State?) {
                super.getItemOffsets(outRect, view, parent, state)
                val position = parent.getChildAdapterPosition(view)
                if (position == 0) {
                    outRect.top = 58.dp
                } else {
                    outRect.top = 0
                }

            }
        })
        helper.attachToRecyclerView(rvExercise)
        adapter.helper = helper
        adapter.actions = object : FavoriteExerciseAdapter.AdapterAction {
            override fun playExercise(exercise: Exercise) {
                val file = exercise.files.firstOrNull { it.mainFile }
                val uri = file?.getFile() ?: ""

                context?.startActivityFromCenter(VideoActivity.newInstance(context, uri), rootView, VideoActivity.REQUEST_CODE)
            }
        }
    }

    private fun initToolbar() {
        toolbar.setOnNavigateIconClickListener { router.exit() }
        toolbar.setOnToolIconClickListener { openNavDrawer() }
    }

    override fun setFavoriteExercises(exercises: ArrayList<Exercise>) {
        showEmptyData(exercises.isEmpty())
        adapter.addData(exercises)
    }

    override fun showDeleteMessage(item: Exercise, position: Int) {
        val snack = Snackbar.make(rootView, R.string.message_remove_from_favorite, Snackbar.LENGTH_LONG)
        snack.setAction(R.string.action_undo) {
            presenter.addToFavorite(item)
            adapter.addItemOnPosition(item, position)
            showEmptyData(adapter.data.isEmpty())
        }
        snack.show()
    }

    private fun showEmptyData(show: Boolean) {
        tvEmpty.visibility = if (show) View.VISIBLE else View.GONE
        emptyIcon.visibility = if (show) View.VISIBLE else View.GONE
    }
}

Solution

  • You can't create instance of an abstract class. You should remove abstract from the class declaration, or you should create new class extending the abstract class and make instances of that class.