tutorial recyclerview poner implement dentro cardview android android-fragments android-recyclerview fragment

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 ^ _ ^