2011-11-14 10 views
5

En la aplicación tengo una Listactivity que tiene un adaptador con TextView y Button (etiquetado como eliminar). Ahora quiero eliminar el elemento correspondiente al botón pulsado. por favor verifique el código y sugiera ??? `cómo configurarOnclickListener() en el botón dentro de ListView?

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener { 
    private final Activity context; 
    private final String[] names; 
    private Button deleteButton= null; 
    public MySimpleArrayAdapter(Activity context, String[] names) { 
     super (context, R.layout.imagelistlayout, names); 
     this.context = context; 
     this.names = names; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     deleteButton.setOnClickListener(this); 
     return rowView; 

    } 

    @Override 
    public void onClick(View convertView) { 
     System.out.println(deleteButton.getTag()); 

    } 

}` 

quiero saber cómo puedo eliminar el elemento cuyo botón se ha hecho clic.

+0

http://stackoverflow.com/questions/1821871/android-how-to-fire-onlistitemclick-in-l istactivity-with-buttons-in-list –

+0

http://www.geekmind.net/2009/11/android-custom-list-item-with-nested.html –

Respuesta

8

encarga solamente de detector de clics dentro getView donde se encuentra el botón utilizando findViewById

esto va a manejar el botón actual fila clic

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener { 
    private final Activity context; 
    private final String[] names; 
    private Button deleteButton= null; 
    public MySimpleArrayAdapter(Activity context, String[] names) { 
     super (context, R.layout.imagelistlayout, names); 
     this.context = context; 
     this.names = names; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       //try to hide textview or something it may help 
      } 
     }); 
     return rowView; 

    } 

}` 
0
deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Log.d("TAG", "position: " + position); 
     } 
    }); 

y la posición que necesita para hacer a final de getView (posición final final, ..., ...) Cuando tenga el puesto, ¡haga lo que quiera con él! Eliminar, modificar o lo que sea ..

+0

System.out.println (deleteButton.getTag()) ; Con esta línea obtengo el último valor de la posición Supongamos que tengo tres elementos en mi lista, el valor de la posición será b 2. – Sandroid

+0

No use la etiqueta, lo que quiere es la posición en la vista de lista donde hizo clic en el botón, ¿verdad? Entonces tienes el puesto en getView. Si desea eliminar esa fila específica, simplemente elimínela de la lista que envía en el adaptador en esa posición ... luego use suAdapter.notifyDataSetChanged(); – Carnal

0

Muy simple tiene la variable de posición int en getView que se refiere al elemento en el que se ha inflado el botón, así que utilice la variable de posición para eliminar el elemento en el que hizo clic. Solo usa el código a continuación.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     // deleteButton.setOnClickListener(this); 
deleteButton.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       //use position here 
          // delete the item from data string havng position index and the use notifydataset 
      } 

     }); 
     return rowView; 

    } 
9

Usted debe tratar de no codificar el controlador onClick en el método getView pero mira cómo se asigna un método onClick a una vista de lista. Aquí asigna el método de la actividad y eso es lo que debe hacer aquí también.

En ti adaptador crear un método llamado setOnXXXClickListener

public void setOnXXXClickListener(final OnClickListener onClickListener) { 
    this.onXXXClickListener = onClickListener; 
} 

y en su getView asignar este al botón al igual que

viewHolder.xxx.setOnClickListener(this.onXXXClickListener); 

Desde que la actividad a continuación, puede asignar el método onClick como esto

this.adapter.setOnXXXClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d(TAG, "OnXXXClickListener"); 
    } 
}); 
+0

¡Excelente respuesta si necesita llamar a alguna función no relacionada con el adaptador listview! – Leonardo

+0

¿Cómo posicionarse según este enfoque? – Sumit

+0

Si necesita la posición, es muy probable que esté utilizando setOnItemClickListener. Sin embargo, siempre tiene la opción de configurar el usuario TagTag en la vista que asigna el setOnXXXClickListener y luego extraer el valor de la etiqueta que podría ser la posición. – slott

Cuestiones relacionadas