2010-11-16 18 views
47

Tengo una ListActivity con mi adaptador personalizado. y dentro de cada vista, puede tener algunos botones, en los que necesito implementar OnClickListener. Necesito implementar OnClickListener en el adaptador. Sin embargo, no sé cómo llamar a la función como startActivity() o setResult(). ya que el adaptador no se extiende a la Actividad.¿Cómo iniciar la actividad en el adaptador?

¿cuál es la mejor manera de resolver este problema? gracias

Respuesta

133

Simplemente pase en el contexto actual al constructor del adaptador y guárdelo como un campo. Luego, dentro de onClick puede usar ese contexto para llamar a startActivity().

pseudo-código

public class MyAdapter extends Adapter { 
    private Context context; 

    public MyAdapter(Context context) { 
      this.context = context;  
    } 

    public View getView(...){ 
     View v; 
     v.setOnClickListener(new OnClickListener() { 
      void onClick() { 
       context.startActivity(...); 
      } 
     }); 
    } 
} 
+0

gracias alot !!!! usted resuelve mi problema! – justicepenny

+0

pero una pregunta más, ¿qué pasa si necesito llamar a setResult? porque necesito invocar la función de actividad de actividad (...) en mi actividad. gracias por tu ayuda. – justicepenny

+1

Si desea devolver algún resultado de la actividad secundaria, debe iniciar la actividad con startActivityForResult en lugar de StartActivity y anular onActivityResult (que se invoca después de que finaliza la actividad secundaria). –

43

Cuando la aplicación de la onClickListener, puede utilizar v.getContext.startActivity.

btn.setOnClickListener(new OnClickListener() {     
    @Override 
    public void onClick(View v) { 
     v.getContext().startActivity(PUT_YOUR_INTENT_HERE); 
    } 
}); 
+0

muchas gracias, tú resuelven mi problema! – justicepenny

+1

pero una pregunta más, ¿qué sucede si necesito llamar a setResult? porque necesito invocar la función de actividad de actividad (...) en mi actividad. gracias por tu ayuda. – justicepenny

24
public class MyAdapter extends Adapter { 
    private Context context; 

    public MyAdapter(Context context) { 
      this.context = context;  
    } 

    public View getView(...){ 
     View v; 
     v.setOnClickListener(new OnClickListener() { 
      void onClick() { 
        Intent intent= new Intent(context, goto.class); 
        intent.putextra("your_extra","your_class_value"); 
       context.startActivity(intent); 
      } 
     }); 
    } 
} 
+0

funciona como un amuleto .. –

+1

Un hilo viejo pero que agrega resultados de búsqueda más nuevos: esta devolución de llamada va en contra del patrón de diseño ya que los Intents deben ser creados y ejecutados dentro de actividades que los oyentes son los mejores para este caso usado. – DevKRos

1

devolución de llamada desde el adaptador de actividad se puede realizar usando oyente registrando en forma de interfaz: Hacer una interfaz:

 public MyInterface{ 
     public void yourmethod(//incase needs parameters); 
     } 

En del adaptador Digamos MyAdapter:

public MyAdapter extends BaseAdapter{ 
     private MyInterface listener; 

    MyAdapter(Context context){ 
     try { 
      this. listener = ((MyInterface) context); 
       } catch (ClassCastException e) { 
       throw new ClassCastException("Activity must implement MyInterface"); 
      } 

// haz esto donde necesites disparar al oyente l

  try { 
       listener . yourmethod(); 
      } catch (ClassCastException exception) { 
       // do something 
      } 

     In Activity Implement your method: 


     MyActivity extends AppCompatActivity implements MyInterface{ 

       yourmethod(){ 
       //do whatever you want 
        } 
        } 
6

Para las versiones más nuevas de sdk, debe establecer la actividad de la bandera.

public void onClick(View v) 
{ 
    Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class); 
    myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK); 
    context.getApplicationContext().startActivity(myactivity); 
} 
Cuestiones relacionadas