Reputation: 97
I have RecyclerView Implemented in my app. i want to change, add and remove items remotely with notifyItemRemoved and notifyItemChanged and not with setDataChange due to performance difference. i want to make some interface objects i guess but i coudn't figured it out how or where to implement and override inteface method, ect.
this is my implementation of RecyclerView in MainActivity.kt
val linearLayoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = linearLayoutManager
adapter = RecyclerAdapter(itemList)
recyclerView.adapter = adapter
this is my Interface:
public interface AddItemListener {
void addItem(int position);
}
and this is my RecyclerView class with its ViewHolder:
class RecyclerAdapter(val items: ArrayList<RecyclerViewListModel>) :
RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_recycler_view, parent, false))
override fun getItemCount(): Int = items.size
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.onBind()
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun onBind(){}
}
}
i have Floating button in MainActivity. i want to have access Viewholder in order to add element. thanks in advance !
Upvotes: 1
Views: 2822
Reputation: 5644
Add a listener to your adapter like this:
class RecyclerAdapter(val items: ArrayList<RecyclerViewListModel>, internal var listener: AddItemListener) :
RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_recycler_view, parent, false))
override fun getItemCount(): Int = items.size
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.onBind()
}
fun addNewItem(item : RecyclerViewListModel){
items.add(item)
notifyItemInserted(items.size - 1)
}
fun removeItem(position : Int){
items.removeAt(position)
notifyItemRemoved(position)
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
override fun onClick(v: View?) {
listener. addItem(adapterPosition)
}
init {
itemView.setOnClickListener(this)
}
fun onBind(){}
}
}
add click listener in your activity/fragment:
adapter = RecyclerAdapter(itemList, this)
implement AddItemListener fun:
override fun addItem(int position){
// you can get item click position
// you can show the dialog as like "Do you want to delete?"
adapter.romoveItem(position)
}
add new item:
val fab: FloatingActionButton = findViewById(R.id.fab)
fab.setOnClickListener { view ->
adapter.addNewItem(RecyclerViewListModel(verb1, verb2....))
}
Upvotes: 2