Sheila Grant
Sheila Grant

Reputation: 65

non static method can be referenced from a static context

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

Answers (2)

Sheila Grant
Sheila Grant

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

Breavyn
Breavyn

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

Related Questions