繁体   English   中英

在 Kotlin 中为 RecyclerView 创建一个删除按钮

[英]Make a delete button for RecyclerView in Kotlin

这是我在 Kotlin 中的第一个应用程序,但我认为我不太理解其中的逻辑。 我正在尝试为带有 Recycler 视图的列表中的每个元素制作一个删除按钮:

我的 MusicianRecyclerAdapter:

package com.example.genremusicians

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.genremusicians.Models.MusicianInfo
import kotlinx.android.synthetic.main.item_musician_list.view.*

class MusicianRecyclerAdapter (private val context: Context, private val musicians:List<MusicianInfo>) : RecyclerView.Adapter<MusicianRecyclerAdapter.ViewHolder>() {

    private val  layoutInflater = LayoutInflater.from(context)
    inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
        val deleteButton = itemView.deleteButton
        val textGenre = itemView.findViewById<TextView>(R.id.textViewTitle)
        val textMusician = itemView.findViewById<TextView>(R.id.textViewText)
        var musicianPosition = 0
        init {
            itemView.setOnClickListener{
                val intent = Intent(context,MainActivity::class.java)
                intent.putExtra(EXTRA_MUSICIAN_POSITION,musicianPosition)
                context.startActivity(intent)
            }
        }
        init {
            deleteButton.setOnClickListener{
                val intent = Intent(context,MainActivity::class.java)
                intent.removeExtra(EXTRA_MUSICIAN_POSITION)
                context.startActivity(intent)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = layoutInflater.inflate(R.layout.item_musician_list,parent, false)
        return ViewHolder(itemView)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        var musician = musicians[position]
        holder.textGenre.text = musician.genre?.title
        holder.textMusician.text = musician.name
        holder.musicianPosition = position
    }
}

这是我的 MainActivity

package com.example.genremusicians

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.ArrayAdapter
import com.example.genregenres.Models.DataManager
import com.example.genremusicians.Models.GenreInfo
import com.example.genremusicians.Models.MusicianInfo
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private var musicianPosition = POSITION_NOT_SET
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var adapterGenres = ArrayAdapter<GenreInfo>(
            this,
            android.R.layout.simple_spinner_item,
            DataManager.genres.values.toList()
        )

        adapterGenres.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line)
        spinnerGenre.adapter = adapterGenres

        musicianPosition = savedInstanceState?.getInt(EXTRA_MUSICIAN_POSITION, POSITION_NOT_SET)
            ?: intent.getIntExtra(EXTRA_MUSICIAN_POSITION, POSITION_NOT_SET)


        if (musicianPosition != POSITION_NOT_SET) {
            displayMusician()
        } else {
            createMusician()
        }

    }

    private fun createMusician() {
        DataManager.musicians.add(MusicianInfo())
        musicianPosition = DataManager.musicians.lastIndex
    }

    override fun onRestart() {
        super.onRestart()
    }

    override fun onPause() {
        super.onPause()
        saveMusician()
    }

    private fun saveMusician() {
        val musician = DataManager.musicians[musicianPosition]
        musician.name = editTextName.text.toString()
        musician.album = editTextAlbum.text.toString()
        musician.genre = spinnerGenre.selectedItem as GenreInfo
    }

    override fun onStop() {
        super.onStop()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt(EXTRA_MUSICIAN_POSITION, musicianPosition)
    }

    private fun displayMusician() {
        val musician = DataManager.musicians[musicianPosition]
        editTextName.setText(musician.name)
        editTextAlbum.setText(musician.album)
        val genrePosition = DataManager.genres.values.indexOf(musician.genre)
        spinnerGenre.setSelection(genrePosition)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.action_settings -> true
            R.id.action_next -> {
                MoveNext()
            }
            else -> super.onOptionsItemSelected(item)
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
        if (musicianPosition >= DataManager.musicians.lastIndex) {
            var item = menu?.findItem(R.id.action_next)
            if (item != null) {
                item.icon = getDrawable(R.drawable.ic_baseline_block_24)
                item.isEnabled = false
            }
        }
        return super.onPrepareOptionsMenu(menu)
    }

    override fun invalidateOptionsMenu() {
        super.invalidateOptionsMenu()
    }

    private fun MoveNext() {
        musicianPosition++
        displayMusician()
        invalidateOptionsMenu()
    }
}

我从我创建的文件中获取数据以开始学习,但我不明白我在创建删除按钮时做错了什么,以及我应该如何做。 谢谢你们

要设置要删除的点击事件,您必须使用下面和您的适配器中的代码:

private var onClickListener : OnClickListener? = null

fun setOnClickListener(onClickListener: OnClickListener){
    this.onClickListener = onClickListener
}

interface OnClickListener {
    fun onClick(position: Int){
    }
}

然后,您可以创建一个函数来删除 recyclerview 中的项目,这将删除列表中指定位置的项目,并通知 recylerview 一个项目已被删除,以便它会更新:

private fun removeItem(position: Int){
    list.removeAt(position)
    notifyItemRemoved(position)
}

这将允许您在创建接口实例时调用 onClick 函数。 您必须在项目视图的 xml 文件中有一个删除按钮,然后您可以为 onBindViewHolder 中的按钮设置一个 onClickListener ,如下所示:

holder.itemView.btn_delete.setOnClickListener {
                if(onClickListener != null){
                    onClickListener!!.onClick(position)
                    removeItem(position)
                }
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM