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.