0

So I want to make a function which opens a popup menu using Recycler view, I've got the card and icons ready but im not sure how to implement into my StudentAdapter.kt class.

Im new to Kotlin so popup windows are new to me.

I have the code to edit/delete but first of all how do I get the popup menu to work in my recyclerview?

card_items_rec (row for recyclerview)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:padding="1dp"
    android:layout_margin="1dp"
    android:weightSum="1">

    <TextView
        android:id="@+id/tvId"
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        tools:text="Id"
        tools:visibility="invisible"
        tools:ignore="MissingConstraints" />

    <TextView
        android:id="@+id/tvEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:textAlignment="center"
        android:textSize="17dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvBuyAmount"
        app:layout_constraintHorizontal_bias="0.135"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.533"
        tools:text="Date" />

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:padding="4dp"
        android:textAlignment="center"
        android:textSize="17dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvBuyAmount"
        app:layout_constraintHorizontal_bias="0.94"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Name" />

    <TextView
        android:id="@+id/tvBuyAmount"
        android:layout_width="59dp"
        android:layout_height="wrap_content"
        android:padding="7dp"
        android:textAlignment="center"
        android:textSize="15dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvUseAmount"
        app:layout_constraintHorizontal_bias="0.885"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="aaa" />

    <TextView
        android:id="@+id/tvUseAmount"
        android:layout_width="49dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="248dp"
        android:padding="7dp"
        android:textAlignment="center"
        android:textSize="15dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/deleteBtn"
        app:layout_constraintHorizontal_bias="0.269"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="aaa" />

    <ImageView
        android:id="@+id/popupButton"
        android:layout_width="67dp"
        android:layout_height="28dp"
        android:layout_marginStart="28dp"
        android:src="@drawable/ic_menu_more"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="@+id/tvUseAmount"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/deleteBtn"
        android:layout_width="67dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="削除"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.982"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

show_menu.xml

        <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/editText"
            android:title="編集"
            android:icon="@drawable/ic_edit" />
        <item
            android:id="@+id/delete"
            android:title="削除"
            android:icon="@drawable/ic_delete" />
    </menu>

Student.adapter.kt

class StudentAdapter: RecyclerView.Adapter<StudentAdapter.StudentViewHolder>() {
private var stdList: ArrayList<StudentModel> = ArrayList()
private var onClickItem: ((StudentModel) -> Unit)?=null
private var onClickDeleteItem: ((StudentModel) -> Unit)?=null

fun addItems(items: ArrayList<StudentModel>){
    this.stdList=items
    notifyDataSetChanged()
}
fun setOnClickItem(callback:(StudentModel)->Unit){
    this.onClickItem = callback
}
fun setOnClickDeleteItem(callback: (StudentModel) -> Unit){
    this.onClickDeleteItem = callback
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)= StudentViewHolder (
    LayoutInflater.from(parent.context).inflate(R.layout.card_items_rec,parent,false)
)

override fun onBindViewHolder(holder: StudentViewHolder, position: Int) {
    val std = stdList[position]
    holder.bindView(std)
    holder.itemView.setOnClickListener{onClickItem?.invoke(std)}
    holder.btnDelete.setOnClickListener{onClickDeleteItem?.invoke(std)}
}

override fun getItemCount(): Int {
    return stdList.size
}
class StudentViewHolder(var view: View):RecyclerView.ViewHolder(view){
    var id:TextView = view.findViewById<TextView>(R.id.tvId)
    var name:TextView = view.findViewById<TextView>(R.id.tvName)
    var email:TextView = view.findViewById<TextView>(R.id.tvEmail)
    var buyAmount:TextView = view.findViewById<TextView>(R.id.tvBuyAmount)
    var useAmount:TextView = view.findViewById<TextView>(R.id.tvUseAmount)
    var btnDelete:Button = view.findViewById<Button>(R.id.deleteBtn)
    var popupButton: ImageView = view.findViewById(R.id.popupButton)

    fun bindView(std:StudentModel){
        id.text = std.id.toString()
        name.text = std.name
        email.text = std.email
        buyAmount.text = std.buyamount.toString()
        useAmount.text = std.useamount.toString()
    }
}

}

allRecordPage.kt

class allRecordpage : AppCompatActivity() {

private lateinit var edName: EditText
private lateinit var edEmail: Button
private lateinit var edBuyAmount: EditText
private lateinit var edUseAmount: EditText
private lateinit var edReason: EditText
private lateinit var btnAdd: Button
private lateinit var btnView: Button
private lateinit var btnUpdate: Button

private lateinit var sqLiteHelper: SQLiteHelper
private lateinit var recyclerView: RecyclerView
private  var adapter: StudentAdapter?=null
private var std:StudentModel?=null

val dataHolder = "DataHolder"

@RequiresApi(Build.VERSION_CODES.N)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_all_recordpage)

    val textView: TextView =findViewById(R.id.DateText)
    val simpleDateFormat= SimpleDateFormat("yyyy/MM/dd\n   HH:mm", Locale.getDefault()).format(
        Date()
    )
    val currentDateAndTime: String = simpleDateFormat.format(Date())
    textView.text = currentDateAndTime

    val button = findViewById<Button>(R.id.goBackToHome)
    button.setOnClickListener{
        val intent = Intent(this,MainMenu::class.java)
        startActivity(intent)
    }

    initView()
    initRecyclerView()
    sqLiteHelper= SQLiteHelper(this)
    //Show recycler view
    val stdList = sqLiteHelper.getAllStudent()
    Log.e("おっけ","${stdList.size}")

    adapter?.setOnClickItem {

        //購入・使用編集画面に遷移

        if(it.buyamount > 0){
            val intent = Intent(this,buyDetailsScreen::class.java)
            intent.putExtra("date",it.email)
            intent.putExtra("name", it.name)
            intent.putExtra("buyAmount", it.buyamount)
            startActivity(intent)


        }else if (it.useamount > 0){
            val intent = Intent(this,useDetailsScreen::class.java)
            intent.putExtra("date",it.email)
            intent.putExtra("name",it.name)
            intent.putExtra("useAmount",it.useamount)
            intent.putExtra("reason",it.reason)
            startActivity(intent)
        }else{
            Toast.makeText(this,"エラーが発生しました",Toast.LENGTH_LONG).show()
        }

    }
    adapter?.addItems(stdList)
    adapter?.setOnClickDeleteItem{
        deleteStudent(it.id)
    }
}

private fun deleteStudent(id:Int){
    val builder = AlertDialog.Builder(this)
    builder.setMessage("データを削除してよろしいですか")
    builder.setCancelable(true)
    builder.setNegativeButton("いいえ"){dialog, _ ->
        dialog.dismiss()
    }
    builder.setPositiveButton("はい"){dialog, _ ->
        sqLiteHelper.deleteStudentById(id)
        getStudents()
        dialog.dismiss()
    }

    val alert = builder.create()
    alert.show()
}

private fun updateStudent(){
    val name = edName.text.toString()
    val email = edEmail.text.toString()
    val buyAmount = edBuyAmount.text.toString().toInt()
    val useAmount = edUseAmount.text.toString().toInt()
    val reason = edReason.text.toString()
    //Check record not changed
    if(name == std?.name && email == std?.email && buyAmount == std?.buyamount && useAmount == std?.useamount && reason == std?.reason){
        Toast.makeText(this,"データが変更されてない", Toast.LENGTH_SHORT).show()
        return
    }

    if(std == null) return
    val std = StudentModel(id=std!!.id,name = name,email = email, buyamount = buyAmount, useamount = useAmount, reason = reason)
    val status = sqLiteHelper.updateStudent(std)
    if(status > -1){
        clearEditText()
        getStudents()
    }else{
        Toast.makeText(this,"更新失敗した", Toast.LENGTH_SHORT).show()
    }


}
private fun getStudents(){
    val stdList = sqLiteHelper.getAllStudent()
    Log.e("おっけ","${stdList.size}")

    adapter?.addItems(stdList)
}
private fun addStudent(){
    val name = edName.text.toString()
    val email = edEmail.text.toString()
    val buyAmount = edBuyAmount.text.toString().toInt()
    val useAmount = edUseAmount.text.toString().toInt()
    val reason = edReason.text.toString()

    if(name.isEmpty()||email.isEmpty()|| buyAmount.toString().isEmpty() ||useAmount.toString().isEmpty() || reason.toString().isEmpty()){
        Toast.makeText(this,"データを入力してください", Toast.LENGTH_SHORT).show()
    }else{
        val std = StudentModel(name = name, email=email, buyamount=buyAmount, useamount=useAmount, reason = reason)
        val status = sqLiteHelper.insertStudent(std)
        //Check Insert success or not success
        if(status > -2){
            Toast.makeText(this,"データを追加しました。", Toast.LENGTH_SHORT).show()
            clearEditText()
        }else{
            Toast.makeText(this,"データが保存されてないようです。", Toast.LENGTH_SHORT).show()
        }
    }
}
private fun clearEditText(){
    edName.setText("")
    edEmail.text = ""
    edBuyAmount.setText("")
    edUseAmount.setText("")
    edReason.setText("")
    edName.requestFocus()
}
private fun initRecyclerView(){
    recyclerView.layoutManager=LinearLayoutManager(this)
    adapter = StudentAdapter()
    recyclerView.adapter=adapter
}
private fun initView(){
    recyclerView=findViewById(R.id.recyclerView)
}

}

I have the code to edit/delete but first of all how do I get the popup menu to work in my recyclerview?

a_local_nobody
  • 7,947
  • 5
  • 29
  • 51
  • try [this way](https://stackoverflow.com/questions/21329132/android-custom-dropdown-popup-menu). put some code show popup menu inside adapter. – MKD Mar 24 '22 at 07:54
  • @MinhKhang Unfortnately Kotlin and Java language is difficult to translate so its hard for me but thank you for comment – DannyMelander Mar 24 '22 at 07:58

0 Answers0