setOnLongClickListener in kotlin android
Asked Answered
J

2

-2

How can I use setOnClickListener in each item in my ListView?

my xml :

<ListView
    android:id="@+id/tv1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</ListView>
Janellejanene answered 20/8, 2017 at 14:54 Comment(0)
R
2

in your kotlin activity:

override fun onCreate(savedInstanceState: Bundle?) {
  val listView: ListView = findViewById(R.id.yourListViewId)
  listView.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l -> 
    //YOUR CODE HERE
  }
}
Runofthemill answered 20/8, 2017 at 16:23 Comment(6)
He asked for each itemLaure
i want for each itemJanellejanene
The onItemClickListener is for each item. The variable 'i' in the method is the position of each item. You simply use yourItemList.get(i) to retrieve the item to work with. This is the recommended way to do it. You could also use an OnClickListener in your adapter but that increases memory usage.Runofthemill
when i used this method in adapter , it's not working. where can i use it if it doesn't work in adapter ??Janellejanene
You have to use it in the activity where you have reference to listview. In simple words where you are using ListView listView=(ListView)findviewById(R.id.tv1) Redstart
i edited to make it more clear for you. If you are still not comprehending then you need to post your activity code where you initialize the listview so i can make it more obviousRunofthemill
H
0

Nothing like getting to the party late. We are posting this answer because we struggled with setting a OnLongClickListener in our RecyclerAdapter Why because as you enter the code if the RETURN value is not included before adding the lines of code between the opening statement and the return the compiler complains and one would think they are just wrong here is a little code hope it helps anyone new to OnLongClickListener

class PersonRecyclerAdapter(contactList: List<Contact>, internal var context: Context) : RecyclerView.Adapter<PersonRecyclerAdapter.ViewHolder>() {

private var contactList: List<Contact> = ArrayList()
init { this.contactList = contactList }

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

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

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val items = contactList[position]
    holder.item.text = items.name

    holder.bindCheckBox()
    // This code calls the function below in the inner class
    // too much code manipulation

    holder.list_new_card.setOnLongClickListener { view ->
        holder.ckBox.isChecked = false
        holder.ckBox.isEnabled = true
        holder.item.text = items.name
        true

    }
    /*holder.list_new_card.setOnClickListener {

        holder.ckBox.isChecked = false
        holder.ckBox.isEnabled = true
        holder.item.text = items.name

        //val i = Intent(context, MainActivity::class.java)
        //i.putExtra("Mode", "E")
        //i.putExtra("Id", items.id)
        //i.putExtra("ET",items.name)
        //i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        //context.startActivity(i)
        // This code attaches a listener to the tvName in the new_single_card.xml
    }*/

    holder.editCLICK.setOnClickListener {
        val i = Intent(context, MainActivity::class.java)
        i.putExtra("FROM", "U")
        i.putExtra("MainActId",items.id)
        i.putExtra("ET",items.name)
        i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(i)
    }

}

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

    var item: TextView = view.findViewById(R.id.tvName) as TextView
    var list_new_card: CardView = view.findViewById(R.id.list_new_card) as CardView
    var editCLICK: RelativeLayout = view.findViewById(R.id.editCLICK) as RelativeLayout
    var ckBox:CheckBox = view.findViewById(R.id.ckBox)as CheckBox
    // This is how you declare a instance of the Widiget you want to work with

    fun bindCheckBox(){// Create function and BIND it in the onBindViewHolder function

        ckBox.setOnCheckedChangeListener { view,isChecked ->
            if(ckBox.isChecked){
                item.visibility = View.VISIBLE
                item.setTextColor(Color.parseColor("#FF0000"))
                item.text = "Click & HOLD Me to View Item"
                ckBox.isEnabled = false

            }else
            item.setTextColor(Color.parseColor("#000000"))
        }
    }
}

}

Note different ways to include listeners in RecyclerAdapter

Hellbox answered 20/9, 2018 at 5:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.