Botón en ListView usando ArrayAdapter

Tengo un ArrayAdapter que se llena utilizando una clase POJO. La vista de lista consta de 2 diseños. 1 es para un menuitem y uno es para la categoría. La vista de lista con separador está bien.

Más tarde intenté agregar un botón en cada fila de menú para editar los detalles en él. Aquí tengo un problema cuando intenté obtener la posición de la fila donde se hace clic en el botón.

Intenté mostrar la posición utilizando el registro. 1. Si hay menos filas y no es necesario desplazarse. El registro muestra la posición correcta. 2. Si tengo más filas corriendo en las páginas, la posición en mi registro no es correcta.

¿Podría por favor guiarme a la línea donde mi código necesita corrección? Gracias por adelantado

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; 
        } 
}  

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta