Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
256 views
in Technique[技术] by (71.8m points)

java - notifyDataSetChanged does not work in adapter in kotlin

There is a delete button on my recylerview item when I click it I m showing a alert dialog when I click yes button I want to refresh my recylerview but I could'not. I call directly notifyDataSetChanged in adapter at the end of the my code but it does not work.

MyAlertDialog(In my adapter)

            mAlertDialog.setPositiveButton("Yes") { dialog, id ->


            val databaseHandler: DBHelper = DBHelper(holder.itemView.context)
            val removedMed = Medicine(id = medicine.id,name = medicine.name,amount = medicine.amount,description = medicine.description)
            databaseHandler.deleteMedicine(removedMed)


            dialog.dismiss()

            notifyDataSetChanged()
        }

Mainactivity

class MainActivity : AppCompatActivity() {

private var adapter: MedicineAdapter? = null
private var medicineList : ArrayList<Medicine> = arrayListOf()
private var recyclerView: RecyclerView? = null


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


    getDataFromDb()
}


fun getDataFromDb(){

    val context = this
    val db = DBHelper(context)

    recyclerView = findViewById<View>(R.id.recyclerView) as RecyclerView

    adapter = MedicineAdapter(this, db.readData())


    val layoutManager = LinearLayoutManager(applicationContext)

    recyclerView!!.layoutManager = layoutManager
    recyclerView!!.itemAnimator = DefaultItemAnimator()

    // set the adapter
    recyclerView!!.adapter = adapter

    adapter!!.notifyDataSetChanged()

}


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

override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
    R.id.addBtn -> {

        val intent = Intent(this,AddNewMedicine::class.java)
         startActivity(intent)

        true
    }
    else -> super.onOptionsItemSelected(item)
}

override fun onResume() {
    super.onResume()

    getDataFromDb()
}

}

MedicineAdapter

class MedicineAdapter(

private val mainActivity: MainActivity,
val medicineList: ArrayList<Medicine>)

: RecyclerView.Adapter<MedicineAdapter.ListItemHolder>(){



override fun onCreateViewHolder(
    parent: ViewGroup, viewType: Int): ListItemHolder {

    val itemView = LayoutInflater.from(parent.context).inflate(R.layout.medicine_items, parent, false)

    return ListItemHolder(itemView)

}
inner class ListItemHolder(view: View) :
    RecyclerView.ViewHolder(view),
    View.OnClickListener {

    internal var name = view.findViewById<TextView>(R.id.name)

    internal var amount = view.findViewById<TextView>(R.id.amount)

    internal var description = view.findViewById<TextView>(R.id.description)

    internal var deleteButton = view.findViewById<ImageButton>(R.id.deleteBtn)

    internal var editButton = view.findViewById<ImageButton>(R.id.editBtn)

    init {
        view.isClickable = true
        view.setOnClickListener(this)
        deleteButton.setOnClickListener(this)
        editButton.setOnClickListener(this)
    }


    override fun onClick(view: View) {

        //val intentToCarPager = Intent(view!!.context, CarPagerActivity::class.java)

        //view.context.startActivity(intentToCarPager)

    }

}

override fun onBindViewHolder(holder: ListItemHolder, position: Int) {

    val medicine = medicineList!![position]

    holder.name.text = medicine.name

    holder.amount.text = medicine.amount

    holder.description.text = medicine.description

    holder.deleteButton.setOnClickListener {


        val mAlertDialog = AlertDialog.Builder(holder.itemView.context)

        mAlertDialog.setTitle("Are you sure you want to this record!") //set alertdialog title

        mAlertDialog.setPositiveButton("Yes") { dialog, id ->


            val databaseHandler: DBHelper = DBHelper(holder.itemView.context)
            val removedMed = Medicine(id = medicine.id,name = medicine.name,amount = medicine.amount,description = medicine.description)
            databaseHandler.deleteMedicine(removedMed)

            notifyDataSetChanged()
            dialog.dismiss()
            medicineList.removeAt(position)
            notifyItemRemoved(position)



        }


        mAlertDialog.setNegativeButton("No") { dialog, id ->


        }

        mAlertDialog.show()

    }

    holder.editButton.setOnClickListener {

        val dialog = UpdateMedicine(medicine)
        val manager = (holder.itemView.context as MainActivity).supportFragmentManager

        dialog.show(manager,"")


    }
}

override fun getItemCount(): Int {
    if (medicineList != null) {
        return medicineList.size
    }
    return -1
}

}


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I solved my problem by removing the object from the array

        notifyDataSetChanged()
        dialog.dismiss()
        medicineList.removeAt(position)
        notifyItemRemoved(position)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...