Reputation: 65
When a button is clicked, I'm trying to delete the row. At the very bottom, I call the delete method that I made. However it gives me an error (in the question). I tried making the delete method static, tried everything that android suggested
public class myAdapter extends RecyclerView.Adapter<myAdapter.ViewHolder> {
private List<numbers> mNumbers;
public myAdapter (List<numbers> numbers) {
mNumbers = numbers;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_slot, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bindNumbers(mNumbers.get(position));
}
@Override
public int getItemCount() {
return mNumbers.size();
}
public void delete(int position) {
mNumbers.remove(position);
notifyItemRemoved(position);
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView numberText;
EditText checklistText;
Button deleteButton;
CheckBox checkDisBox;
public ViewHolder(View itemView) {
super(itemView);
numberText = (TextView) itemView.findViewById(R.id.number);
checklistText = (EditText) itemView.findViewById(R.id.editText);
deleteButton = (Button) itemView.findViewById(R.id.deleteButton);
checkDisBox = (CheckBox) itemView.findViewById(R.id.checkBox);
deleteButton.setOnClickListener(this);
}
public void bindNumbers(numbers numbers) {
numberText.setText(numbers.getInt() + "");
}
@Override
public void onClick(View v) {
delete(getAdapterPosition());
}
}
}
EDITED PROBLEM BELOW
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bindNumbers(mNumbers.get(position));
holder.deleteButton.setOnClickListener(this);
}
public void delete(int position) {
mNumbers.remove(position);
notifyItemRemoved(position);
}
@Override
public void onClick(View v) {
delete(getAdapterPosition());
}
Upvotes: 1
Views: 2685
Reputation: 65
Code hasnt really changed from my question but removing the static keyword really got rid of a lot of my struggles
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView numberText;
EditText checklistText;
Button deleteButton;
CheckBox checkDisBox;
public ViewHolder(View itemView) {
super(itemView);
numberText = (TextView) itemView.findViewById(R.id.number);
checklistText = (EditText) itemView.findViewById(R.id.editText);
deleteButton = (Button) itemView.findViewById(R.id.deleteButton);
checkDisBox = (CheckBox) itemView.findViewById(R.id.checkBox);
deleteButton.setOnClickListener(this);
}
public void bindNumbers(numbers numbers) {
numberText.setText(numbers.getInt() + "");
}
@Override
public void onClick(View v) {
delete(getAdapterPosition());
}
}
my delete method
public void delete(int position) {
mNumbers.remove(position);
notifyItemRemoved(position);
}
Upvotes: 0
Reputation: 2242
Edit
I just went and implemented this myself, and this is what worked for me.
Create an interface for deleting items
public interface DeleteItem {
void delete(int position);
}
Make your adapter implement this interface
public class myAdapter
extends RecyclerView.Adapter<myAdapter.ViewHolder>
implements DeleteItem {
@Override
public void delete(int position) {
mNumbers.remove(position);
notifyItemRemoved(position);
}
}
Set your viewholder to take a reference to the interface
DeleteItem mDeleteItem;
public ViewHolder(View itemView, DeleteItem deleteItem) {
super(itemView);
mDeleteItem = deleteItem;
...
}
Modify your view holders on click handler
@Override
public void onClick(View v) {
mDeleteItem.delete(getAdapterPosition());
}
Finally when creating your view holder pass it the reference
ViewHolder vh = new ViewHolder(v, this);
Original Answer
A ViewHolder
is to save your application from having to find the views inside of list items. It should only contain the myview = itemView.findViewById()
type calls and nothing else.
The bindViewHolder()
method should contain all the code that uses those views you found in the view holder.
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.bindNumbers(mNumbers.get(position));
// add listener here
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
delete(position);
}
}
}
Upvotes: 2