如何在回收站视图中选择项目并使用它?

How to make item selectable in recycler view and use it?

我已按照 android 开发人员文档创建回收站视图。但是现在我想让这个项目可以选择。

目前已创建itemAdapter.kt

class ItemAdapter(
    private val context: Context,
    private val dataset: List<Mode>,
    private val itemClickListener: MainActivity
) : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() {
    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder.

    class ItemViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView = view.findViewById(R.id.item_title)
    }

    /**
     * Create new views (invoked by the layout manager)
     */
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        // create a new view
        val adapterLayout = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item, parent, false)

        return ItemViewHolder(adapterLayout)
    }

    /**
     * Replace the contents of a view (invoked by the layout manager)
     */
    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = dataset[position]
        holder.textView.text = context.resources.getString(item.stringResourceId)
        holder.itemView.setOnClickListener {
            itemClickListener.onItemClick(item) //here we are sending the mode object using interface
        }
    }

    /**
     * Return the size of your dataset (invoked by the layout manager)
     */
    override fun getItemCount() = dataset.size

    interface ItemClickListener {
        fun onItemClick(mode: Mode)
    }

}

然后有一个名为Modes.kt

的数据文件
class Modes {
    fun loadModes(): List<Mode> {
        return listOf(
            Mode(R.string.height),
            Mode(R.string.hleveldistance),
        )
    }
}

然后是模型文件Model.kt

data class Mode(val stringResourceId: Int)

如何在 mainactivity 中为我的函数获取所选项目。

class MainActivity : AppCompatActivity() {

    //private var etCommand: EditText? = null
    private var tvPalaute: TextView? = null
    private val modes = Modes().loadModes()

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

        // Initialize modes

 val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.adapter = ItemAdapter(this, modes, this)
        // Use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        recyclerView.setHasFixedSize(true)

        //val etCommand: EditText = findViewById(R.id.et_command)
        val etSubmit: Button = findViewById(R.id.btn_submit)
        val etMeasure: Button = findViewById(R.id.btn_measure)

        tvPalaute = findViewById(R.id.tvPalaute)


        etSubmit.setOnClickListener {
                Toast.makeText(this, "Haetaan laite", Toast.LENGTH_SHORT).show()
                openActivityForResult()
        }

        etMeasure.setOnClickListener {
                Toast.makeText(this, "Aloitetaan mittaus", Toast.LENGTH_SHORT).show()
                openMeasureActivityForResult()
        }
    }

    fun onItemClick(mode: Mode) {
//openMeasureActivityForResult(mode) // update method to receive mode as an argument
        Log.d(mode.code, "mode code")
        Toast.makeText(this, "Mode is $mode", Toast.LENGTH_SHORT).show()
    }

    private fun openMeasureActivityForResult(mode: Mode) {
        val measureAction = "com.app.app.m"
        val intent = Intent()
        intent.action = measureAction
        //val selectedMode = mode?.Id
        //var mode = modes[selectedMode!!]
        intent.putExtra("Mode", mode?.code)
        Log.d(intent.toString(), "intent")
        intent.putExtra("AppName", "Example App")
        //if (!String.toString().isNullOrEmpty(Device))
        //{
          //  intent.putExtra("Device", Device);
        //}
        measureLauncher.launch(intent)
    }

这是我目前的代码状态。 openmeasureactivity 函数的参数应该是什么?代码看起来还好吗,因为现在没有使用 itemadapter。所选项目看起来正确吗?

我有同样的问题,我为点击创建了一个界面,然后在你的片段中你用你想做的任何事情覆盖这个乐趣。

// Here I add --> val itemClickListener: ItemClickListener
class MovieAdapter(
private val movies: List<Mode>, 
val itemClickListener: ItemClickListener) : RecyclerView.Adapter<MovieAdapter.ViewHolder>() {

    private lateinit var context: Context

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val binding = ItemMovieBinding.bind(itemView)

        fun bind(mode: Mode) {
            // Here we set the setOnClickListener
            itemView.setOnClickListener {itemClickListener.onClick(mode)}
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        context = parent.context
        // R.layout.item_mode --> change to yor layout
        return ViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_mode, parent, false)
        )
    }

    /**
     * Returns the size of the list
     */
    override fun getItemCount(): Int = movies.size

    /**
     * Called by RecyclerView to display the data at the specified position.
     */
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(movies[position])
    }
}
// The interface we can use in the fragment
interface ItemClickListener{
    fun onClick(mode: Mode)
}

然后你就可以在你的片段中使用接口了:

override fun onClick(mode: Mode) {
   // here you can use the object
}

您可以使用 interfaceobjects 传递给 activity

创建一个 interface ItemClickListener,方法名为 onItemClick,类型为 parameter,无论你想在 activity 中接收什么。这里使用 Mode

interface ItemClickListener {
    fun onItemClick(mode: Mode)
}

在您的 activityfragment 中实现此 interface,并覆盖 onItemClick 方法以对选定的 Mode 对象执行任何操作。

class MainActivity : ItemClickListener {

    override fun onItemClick(mode: Mode) {
        openMeasureActivityForResult(mode) // update method to receive mode as an argument
    }

    private fun openMeasureActivityForResult(mode: Mode) { //use mode here
        val measureAction = "com.app.app.m"
        val intent = Intent()
        intent.action = measureAction
        //var mode = modes[SelectedMode] <-- here the selected value
        //intent.putExtra("Mode", mode.Code); <-- also here
        intent.putExtra("AppName", "Example App")
        //if (!String.toString().isNullOrEmpty(Device))
        //{
          //  intent.putExtra("Device", Device);
        //}
        measureLauncher.launch(intent)
    }
}

更改 ItemAdapter 以在其 constructor

中接受 ItemClickListener
class ItemAdapter(
    private val context: Context,
    private val dataset: List<Mode>,
    private val itemClickListener: ItemClickListener
) : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() {


}

onBindViewHolder() 中为 holder 设置点击监听器 itemView 并使用 itemClickListener

传递 mode 对象
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = dataset[position]
        holder.textView.text = context.resources.getString(item.stringResourceId)
        holder.itemView.setOnClickListener {
            itemClickListener.onItemClick(item) //here we are sending the mode object using interface
        }
    }

activityfragment中,当你创建adapter时只需要传递ItemClickListener的接口实例,我们可以使用this传递它因为我们已经在上面实现了它。

val adapter = ItemAdapter(
    context,
    modeList,
    this 
)