如何在回收站视图中选择项目并使用它?
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
}
您可以使用 interface
将 objects
传递给 activity
。
创建一个 interface
ItemClickListener
,方法名为 onItemClick
,类型为 parameter
,无论你想在 activity
中接收什么。这里使用 Mode
interface ItemClickListener {
fun onItemClick(mode: Mode)
}
在您的 activity
或 fragment
中实现此 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
}
}
在activity
或fragment
中,当你创建adapter
时只需要传递ItemClickListener
的接口实例,我们可以使用this
传递它因为我们已经在上面实现了它。
val adapter = ItemAdapter(
context,
modeList,
this
)
我已按照 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
}
您可以使用 interface
将 objects
传递给 activity
。
创建一个 interface
ItemClickListener
,方法名为 onItemClick
,类型为 parameter
,无论你想在 activity
中接收什么。这里使用 Mode
interface ItemClickListener {
fun onItemClick(mode: Mode)
}
在您的 activity
或 fragment
中实现此 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
}
}
在activity
或fragment
中,当你创建adapter
时只需要传递ItemClickListener
的接口实例,我们可以使用this
传递它因为我们已经在上面实现了它。
val adapter = ItemAdapter(
context,
modeList,
this
)