¿Cómo puedo hacer clic en cada elemento individualmente cuando uso BaseAdapter en ListView?

Tengo un problema al hacer clic en el elemento en un personalizado ListView que contiene ToggleButton, Button, TextView y Spinner en cada fila. La pregunta: ¿Cómo puedo hacer eso cuando hago clic en cada vista individualmente, se llama a una acción diferente para cada vista? Mi código:

public class CustomListAdapter extends BaseAdapter {

             Context _context;
             private ArrayList<String> _list;  

             public CustomListAdapter(Context context, 
                                         ArrayList<String> listItems) {
              _context= context;
              _list = listItems; 
             }

             public int getCount(){
              return _list.size();
             }

             public long getItemId(int position){
              return position;
             }

             public Object getItem(int position){
              return _list.get(position);
             } 



             public View getView(int position,View convertView,ViewGroup parent)
             {
               ViewContainer container = new ViewContainer();       

               if(convertView == null)
               {  
                   LayoutInflater inflater = LayoutInflater.from(_context);
                   convertView = inflater.inflate(R.layout.elements,parent, false);
                   convertView.setTag(container); 
                   convertView.setClickable(true);

                   container.listIcon = (ToggleButton)convertView.findViewById(R.id.togle_item);
                   container.listText = (TextView)convertView.findViewById(R.id.text_listitem);
                   container.spinner=(Spinner)convertView.findViewById(R.id.spinner1);
                   container.but=(Button)convertView.findViewById(R.id.button1);
                  convertView.setOnClickListener(new OnClickListener() {

                       public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
                       {

                         **How can I do that when I click each view individually, different action is called for each view???**
                       }

                    public void onClick(View v) {

                    }

                    }
                  );
               }
                 container = (ViewContainer) convertView.getTag();
                 ToggleButton myListIcon = container.listIcon;
                 myListIcon.setChecked(true);
                 Button MyButton=container.but;
                 TextView myListText = container.listText;
                 myListText.setText(_list.get(position));
                 Spinner MySpinner=container.spinner;
                 MySpinner.setAdapter(adapter);
                 container = null;
                 return convertView;
              }
              private class ViewContainer
              {
                  private ToggleButton listIcon; 
                  private TextView listText;
                  private Spinner spinner;
                  private Button but;
              }

        }

preguntado el 03 de mayo de 12 a las 18:05

¿Estás diciendo que el mismo botón en diferentes filas haría cosas diferentes? Parece un escenario bastante extraño y creo que sería confuso para los usuarios. -

4 Respuestas

Supongo que tiene un botón, una vista de texto y ... en una vista de lista. y necesita escribir la acción para el botón en la vista de lista.

este es el formato de codificación:

        .....
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.calllog_row, null);
            button1 = (Button) view.findViewById(R.id.button1);
            button1.setOnClickListener(this);
        }
        else {
            view = convertView;
        }

        Button1 = (Button) view.findViewById(R.id.Button1);
        Button1.setTag(position);   // this is important


        return view;
    }
    public void onClick(View v) {
        Integer position = (Integer) v.getTag();
        switch (v.getId()) {
        case R.id.button1:
            Log.e("click position ", "" + position);
            break;

    }

 ......

si mi suposición es correcta, mi codificación le será útil.

contestado el 03 de mayo de 12 a las 19:05

Muy buena respuesta, muchas gracias por compartir conocimientos. - mohan raj s

necesita modificar su getView como muestro el código a continuación.

@Override
        public View getView(int position, View convertView, ViewGroup arg2) {
            ViewContainer container;

            if(convertView == null)
               {  
                   LayoutInflater inflater = LayoutInflater.from(_context);
                   convertView = inflater.inflate(R.layout.elements,parent, false);
                   container = new ViewContainer(); 
                   //convertView.setClickable(true);
                   container.listIcon = (ToggleButton)convertView.findViewById(R.id.togle_item);
                   container.listText = (TextView)convertView.findViewById(R.id.text_listitem);
                   container.spinner=(Spinner)convertView.findViewById(R.id.spinner1);
                   container.but=(Button)convertView.findViewById(R.id.button1);
                   convertView.setTag(container); 
               }else{
                   container=convertView.getTag();
               }
            //Now for set Click event for your Induavidual item in list you can do like below
            //use postion to set id of each item
            container.but.setId(position);
            container.but.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                              //This will give you position of item 
                             int id=v.getId();

                }
            });

        //same you can do for spinner and textview and ToggleButton ,use appropriate method that you want to use 

            return convertView;
        }

contestado el 03 de mayo de 12 a las 19:05

En lugar de agregar un OnClickListener de las personas acusadas injustamente llamadas convertView añadir oyentes para cada View de la fila para la que necesita tener diferentes acciones:

//...
container.listIcon.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
      //action for the toggle Button
   }
});
container.but.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
      //action for the simple Button
   }
});
container.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
     public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
       //something was selected on the spinner
    }

    public void onNothingSelected(AdapterView parent) {
      // for interface
    }
});
//...

contestado el 04 de mayo de 12 a las 10:05

ayuda :) todo funciona excepto spinner.setOnItemClickListener. Error de lanzamiento del programa... ¿Cómo puedo seleccionar uno de los elementos en la ruleta y saber cuál es? - user1373101

@ user1373101 Lo siento, usé el oyente equivocado. Ver mi respuesta editada. en el metodo onItemSelected obtiene la posición del elemento en el que se hizo clic (si hace clic en la primera fila, el position el parámetro será 0, si hace clic en la segunda fila, el position el parámetro será 1, etc.). - usuario

vh.orderButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            // ---Starting new intent
            Intent in = new Intent(activity.getApplicationContext(), ActivityOrder.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ;
            // ---sending product no to next activity
            in.putExtra("product_category", productNo);
            in.putExtra("business_id", businessId); 
            // ---starting new activity and expecting some response back
            activity.getApplicationContext().startActivity(in);

            Toast.makeText(activity, productNo + " " + businessId, Toast.LENGTH_SHORT).show();
        }
    });

Respondido el 17 de enero de 14 a las 01:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.