Saltar al contenido

Llamar al método de actividad desde el adaptador

Después de investigar con expertos en este tema, programadores de deferentes ramas y profesores dimos con la solución a la cuestión y la dejamos plasmada en esta publicación.

Solución:

Sí tu puedes.

En el adaptador, agregue un nuevo campo:

private Context mContext;

En el Constructor del adaptador, agregue el siguiente código:

public AdapterName(......, Context context) 
  //your code.
  this.mContext = context;

En el getView (…) de Adapter:

Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() 
  @Override
  public void onClick(View v) 
    if (mContext instanceof YourActivityName) 
      ((YourActivityName)mContext).yourDesiredMethod();
    
  
);

reemplácelo con sus propios nombres de clase donde vea su código, su actividad, etc.

Si necesita usar este mismo adaptador para más de una actividad, entonces:

Crea una interfaz

public interface IMethodCaller 
    void yourDesiredMethod();

Implemente esta interfaz en las actividades que necesite para tener esta funcionalidad de llamada al método.

Luego, en Adapter getView (), llame como:

Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() 
    @Override
    public void onClick(View v) 
        if (mContext instanceof IMethodCaller) 
            ((IMethodCaller) mContext).yourDesiredMethod();
        
    
);

Estás listo. Si necesita usar este adaptador para actividades que no requieren este mecanismo de llamada, el código no se ejecutará (si la verificación falla).

Puedes hacerlo de esta manera:

Declarar interfaz:

public interface MyInterface
    public void foo();

Deje que su actividad la complemente:

    public class MyActivity extends Activity implements MyInterface
        public void foo()
            //do stuff
        
        
        public onCreate()
            //your code
            MyAdapter adapter = new MyAdapter(this); //this will work as your 
                                                     //MyInterface listener
        
    

Luego, pase su actividad a ListAdater:

public MyAdapter extends BaseAdater
    private MyInterface listener;

    public MyAdapter(MyInterface listener)
        this.listener = listener;
    

Y en algún lugar del adaptador, cuando necesite llamar a ese método de actividad:

listener.foo();

Original:

Entiendo la respuesta actual, pero necesitaba un ejemplo más claro. Aquí hay un ejemplo de lo que usé con un Adapter(RecyclerView.Adapter) y un Activity.

En tu actividad:

Esto implementará el interface que tenemos en nuestro Adapter. En este ejemplo, se llamará cuando el usuario haga clic en un elemento en el RecyclerView.

public class MyActivity extends Activity implements AdapterCallback 

    private MyAdapter myAdapter;

    @Override
    public void onMethodCallback() 
       // do something
    

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        myAdapter = new MyAdapter(this);
    

En su adaptador:

En el Activity, iniciamos nuestro Adapter y pasó esto como argumento al constructor. Esto iniciará nuestro interface para nuestro método de devolución de llamada. Puede ver que usamos nuestro método de devolución de llamada para los clics de los usuarios.

public class MyAdapter extends RecyclerView.Adapter 

    private AdapterCallback adapterCallback;

    public MyAdapter(Context context) 
        try 
            adapterCallback = ((AdapterCallback) context);
         catch (ClassCastException e) 
            throw new ClassCastException("Activity must implement AdapterCallback.", e);
        
    

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int position) 
        // simple example, call interface here
        // not complete
        viewHolder.itemView.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View view) 
                try 
                    adapterCallback.onMethodCallback();
                 catch (ClassCastException e) 
                   // do something
                
            
        );
    

    public static interface AdapterCallback 
        void onMethodCallback();
    

No se te olvide comunicar este artículo si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *