Search code examples
androidlistviewandroid-arrayadapter

setOnClickListener Inside Adapter with ViewHolder Pattern fail


I have a issue that with OnClickListener() Event.

The data or variable for each itemlist in each button view gave a mismatch value.

Further more, I test position that was given by print out some Log.

It show that position was mismatch according to the item row (maybe this is because recycle of view)

So, the below is my implementation of my adapter class and please help me identify it.

Please give me a guide and appropriate way to solve this problem.

MyAdapter.Class

private List<Result> results;

public ManifestAdapter(Context context, int view, List<Result> results) {
    super(context, view, results);
    this.results = results;
    this.context = context;

    sSave = context.getResources().getString(R.string.complete);
    sCancel = context.getResources().getString(R.string.cancel);
    sEditData = context.getResources().getString(R.string.edit_data);
    colorShipping = context.getResources().getColor(R.color.status_shipping);
    colorShippingComplete = context.getResources().getColor(R.color.status_shipping_complete);
    colorShippingIncomplete = context.getResources().getColor(R.color.status_shipping_incomplete);
}

@Override
public Result getItem(int position) {
    return results.get(position);
}



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

        int pos = position;
        ViewHolder holder = null;

    if (convertView == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.listitem_manifest, null);

        holder = new ViewHolder();
        holder.front = (RelativeLayout) convertView.findViewById(R.id.front);
        holder.qrcode = (TextView) convertView.findViewById(R.id.qrcode);
        holder.amount = (TextView) convertView.findViewById(R.id.amount);
        holder.customer = (TextView) convertView.findViewById(R.id.customer);
        holder.address = (TextView) convertView.findViewById(R.id.receiverAddress);
        holder.btnTel  = (Button) convertView.findViewById(R.id.receiverTel);
        holder.btnMap = (Button) convertView.findViewById(R.id.district);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    final Result result = getItem(position);


    .....
    .....
    .....


    // setup call
    if (result.getReceiverTel() != null) {
        if (!result.getReceiverTel().equals("")) {
            holder.btnTel.setText(result.getReceiverTel().trim());
            holder.btnTel.setTag(position);
            holder.btnTel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = (Integer)v.getTag();
                    String uri = "tel:" + getItem(pos).getReceiverTel().trim();
                    Intent iCall = new Intent(Intent.ACTION_DIAL);
                    iCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    iCall.setData(Uri.parse(uri));
                    context.startActivity(iCall);
                }
            });
        }
    }
    return convertView;
}

private static class ViewHolder{
    RelativeLayout front;
    TextView qrcode;
    TextView amount;
    TextView customer;
    TextView address;
    Button btnTel;
    Button btnMap;
    int position;
}

Solution

  • Please change this code.

     // setup call
        if (result.getReceiverTel() != null) {
            if (!result.getReceiverTel().equals("")) {
                holder.btnTel.setText(result.getReceiverTel().trim());
                holder.btnTel.setTag(position);
                holder.btnTel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = (Integer)v.getTag();
                        String uri = "tel:" + getItem(pos).getReceiverTel().trim();
                        Intent iCall = new Intent(Intent.ACTION_DIAL);
                        iCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        iCall.setData(Uri.parse(uri));
                        context.startActivity(iCall);
                    }
                });
            }
        }
    

    to

    // setup call
      holder.btnTel.setTag(position);
    
        if (result.getReceiverTel() != null) {
            if (!result.getReceiverTel().equals("")) {
                holder.btnTel.setText(result.getReceiverTel().trim());
    
                holder.btnTel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = (Integer)v.getTag();
                        String uri = "tel:" + getItem(pos).getReceiverTel().trim();
                        Intent iCall = new Intent(Intent.ACTION_DIAL);
                        iCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        iCall.setData(Uri.parse(uri));
                        context.startActivity(iCall);
                    }
                });
            }
        }
    

    If you have any query, Please let know.