Button in ListView using ArrayAdapter

I have an ArrayAdapter that is populated using the POJO class. The list consists of 2 layouts. 1 for a menu item and one for a category. Listview with seperator ok.

Later I tried to add a button to each menuitem line to edit the details. Here I have a problem when I tried to get the position of the row the button is clicked on.

I tried to display the position using the log. 1. If the number of lines is less, and there is no need to scroll through them. the log shows the correct position. 2. If I have more lines running on pages, then the position in my journal is incorrect.

Could you advise me a line where my code needs to be fixed? Thanks at Advance

public class ConfirmAdapter extends ArrayAdapter<POJO_ConfirmMenu> { private ArrayList<POJO_ConfirmMenu> ticketItem; Context context; LayoutInflater vi; public ConfirmAdapter(Context context ,ArrayList<POJO_ConfirmMenu> menu) { super(context, 0, menu ); this.ticketItem = new ArrayList<POJO_ConfirmMenu>(); this.ticketItem.addAll(menu); this.context =context; vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } private class ViewHolder { TextView ticketItem; TextView type; TextView quantity; Button cancel,edit; } public boolean isEnabled(int position) { if (ticketItem.get(position).getItemType().equals("menucategory")) return false; return true; } public int getItemViewType(int position) { if (ticketItem.get(position).getItemType().equals("menucategory")) return 0; return 1; } public int getViewTypeCount() { return 2; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; int type = getItemViewType(position); if (convertView == null) { holder = new ViewHolder(); switch (type) { case 0: convertView = vi.inflate(R.layout.group, null); holder.ticketItem = (TextView) convertView.findViewById(R.id.tvGroup); convertView.setBackgroundColor(Color.RED); break; case 1: convertView = vi.inflate(R.layout.confirmitem, null); holder.ticketItem = (TextView) convertView.findViewById(R.id.tvConfirmItem); holder.quantity = (TextView) convertView.findViewById(R.id.tvQuantity); holder.cancel = (Button) convertView.findViewById(R.id.bCancel); holder.edit = (Button) convertView.findViewById(R.id.bEdit); holder.edit.setTag(position); // Edit button holder.edit.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { int pos = (Integer) v.getTag(); Log.i("ConfirmAdapter ","Order Edit @ position : " + pos); } }); break; } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } switch (type) { case 0: holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getCategoryName()) ; convertView.setBackgroundColor(Color.RED); break; case 1: holder.ticketItem.setText(ticketItem.get(position).getTicketItemObject().getName()); holder.quantity.setText(Integer.toString(ticketItem.get(position).getTicketItemObject().getItemCount())); break; } return convertView; } } 

}

0
source share
1 answer

As part of the getView() method, you must set the tag on your button, and when you click on the button, get the tag inside the whole, it will return you the correct position of your button click, something like below.

 else { holder = (ViewHolder) convertView.getTag(); } holder.edit.setTag(position); //to get the orignal position later in onClick() of button holder.edit.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { int pos = (Integer) v.getTag(); //the real and updated position Log.i("ConfirmAdapter ","Order Edit @ position : " + pos); } }); 

Update

Note: after receiving the convert-view tag, set the tag on your button and even click on the link.

What is the main purpose of setTag () getTag () View methods?

+4
source

All Articles