android - poner - Cómo enviar datos del adaptador de reciclado a fragmento | Cómo llamar a la función de fragmento desde el adaptador recyclerview
recyclerview fragment tutorial (2)
Tengo un código en Fragment:
InfoAdapter adapter = new InfoAdapter(getContext(), R.layout.lv_info, infoList );
listingsView = (RecyclerView) rootView.findViewById(R.id.lvInfo);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
listingsView.setLayoutManager(layoutManager);
listingsView.setHasFixedSize(true);
listingsView.setAdapter(adapter);
¿Cómo trato los clics en un elemento de este fragmento? Por ejemplo, función de llamada (función ubicada en fragmento) con elemento ID (por ejemplo, public void onItemClick (int item_id) {} )
Mi adaptador:
public class InfoAdapter extends RecyclerView.Adapter<InfoHolder> {
private final List<Info> infos;
private Context context;
private int itemResource;
public InfoAdapter(Context context, int itemResource, List<Info> infos) {
this.infos = infos;
this.context = context;
this.itemResource = itemResource;
}
@Override
public InfoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(this.itemResource, parent, false);
return new InfoHolder(this.context, view);
}
@Override
public void onBindViewHolder(InfoHolder holder, int position) {
Info info = this.infos.get(position);
holder.bindInfo(info);
}
@Override
public int getItemCount() {
return this.infos.size();
}
}
En su método onBindViewHolder, establezca onclicklistener en la vista vinculada y pase sus parámetros a través de Bundle.
Puede usar la interfaz para lograr el resultado deseado. Simplemente declare una interfaz en su adaptador con los parámetros que desea pasar a su fragmento. Y en su fragmento, inicialice la interfaz y páselo al constructor de su adaptador.
Puedes hacer algo como esto:
En tu Fragmento
public class MainFragment extends Fragment {
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Pass your adapter interface in the constructor
InfoAdapter adapter = new InfoAdapter(getContext(), R.layout.lv_info, infoList, adapterInterface );
}
// This is the interface declared inside your adapter.
InfoAdapter.InfoAdapterInterface adapterInterface = new InfoAdapter.InfoAdapterInterface() {
@Override
public void OnItemClicked(int item_id) {
// Do whatever you wants to do with this data that is coming from your adapter
}
};
}
En tu adaptador
public class InfoAdapter extends RecyclerView.Adapter<InfoHolder> {
private final List<Info> infos;
private Context context;
private int itemResource;
// Interface Object
private InfoAdapterInterface adapterInterface;
public InfoAdapter(Context context, int itemResource, List<Info> infos, InfoAdapterInterface adapterInterface) {
this.infos = infos;
this.context = context;
this.itemResource = itemResource;
// Initialize your interface to send updates to fragment.
this.adapterInterface = adapterInterface;
}
@Override
public InfoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(this.itemResource, parent, false);
return new InfoHolder(this.context, view);
}
@Override
public void onBindViewHolder(InfoHolder holder, int position) {
Info info = this.infos.get(position);
holder.bindInfo(info);
// You can pass any data here that is defined in your interface''s params
adapterInterface.OnItemClicked(3);
}
@Override
public int getItemCount() {
return this.infos.size();
}
// Your interface to send data to your fragment
public interface InfoAdapterInterface{
void OnItemClicked(int item_id);
}
}
Puede crear múltiples métodos en su interfaz y puede obtener fácilmente los datos deseados dentro de su interfaz. Otro truco puede ser el uso de métodos abstractos .
Espero que esto ayude. Avísame si enfrentas alguna dificultad :)
Editar para mostrar cómo pasar la interfaz desde el adaptador a ViewHolder
En su clase de adaptador haga esto
@Override
public InfoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(this.itemResource, parent, false);
// Pass the interface that you''ve created in the constructor of your viewholder
return new InfoHolder(view, adapterInterface);
}
Y en tu ViewHolder puedes obtener la interfaz de esta manera y usarla donde quieras dentro de tu ViewHolder:
public class InfoHolder extends RecyclerView.ViewHolder {
public InfoHolder(View itemView, final InfoAdapter.InfoAdapterInterface adapterInterface) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapterInterface.OnItemClicked(2);
}
});
}
}
Esto debería resolver su problema con las interfaces ^ _ ^