Search code examples
androidlistviewonclicklistenerandroid-listfragment

Button Click for ListViewFragment


I have a Fragment that extends ListFragment which uses a custom Adapter.

Each row of the ListView has a Button and I know in the Adapter

getView method I can set a listener for the button as follows:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder; //View lookup cached stored in tag.
    if(convertView == null){
        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.pay_debit_credit_item, parent, false);
        viewHolder.makePayment = (Button) convertView.findViewById(R.id.paymentButton);
        viewHolder.makePayment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "Hellooo", Toast.LENGTH_SHORT).show();
            }
        });
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    //...
    //Return view to be rendered.
    return convertView;
} 

Which works fine, but how do I notify the Fragment that is using this adapter that the button at position x has been clicked?


Solution

  • first create an interface :

    public interface IClickListener {
        public void clicked(View view,int position);
    }
    

    then instantiate it in your adapter class:

    IClickListener clicListener;
        public ListAdapterConstructor(Context context, Cursor c,IClickListener listener) {
            super(context, c);
            mContext = context;
            this.clicListener = listener;
        }
    

    in getView method set on click event for button:

    viewHolder.button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    clicListener.clicked(v,po);
                    }
            });
    

    and at least change your fragment to implement event listener:

    public class YourFragment extends Fragment implements IClickListener {