Comment passer des données à partir de Recyclerview de Fragment
J'ai un recyclerView peuplé de dans un Fragment, et je veux Lancer un nouveau Fragment et de transmettre des données à partir de la carte ,j'essaie d'utiliser des Faisceaux, mais il donne toujours une valeur nulle de ma Classe d'Adaptateur
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private LayoutInflater inflater;
private List<Information> mList;
private FragmentCommunication mCommunicator;
public RecyclerAdapter(Context context, List<Information> list,FragmentCommunication communication) {
inflater = LayoutInflater.from(context);
mList = list;
mCommunicator=communication;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.single_row, parent, false);
MyViewHolder holder = new MyViewHolder(view,mCommunicator);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final Information current = mList.get(position);
holder.name.setText(current.name);
holder.job.setText(current.job);
FragmentB fragmentB=new FragmentB();
Bundle bundle=new Bundle();
bundle.putString("NAME",current.name);
bundle.putString("JOB",current.job);
fragmentB.setArguments(bundle);
}
@Override
public int getItemCount() {
return mList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView name;
TextView job;
FragmentCommunication mComminication;
public MyViewHolder(View itemView, FragmentCommunication Communicator) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.tv_name);
job = (TextView) itemView.findViewById(R.id.tv_gob);
mComminication=Communicator;
name.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mComminication.respond(getAdapterPosition());
}
}
et c'est mon nouveau Fragment que je veux lancer
public class FragmentB extends Fragment {
TextView textview;
TextView textView2;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_b,container,false);
textview= (TextView) view.findViewById(R.id.tv_name);
textView2= (TextView) view.findViewById(R.id.tv_job);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle arguments = getArguments();
if (arguments!=null){
String name= arguments.get("NAME").toString();
String job= arguments.get("JOB").toString();
textview.setText(name);
textView2.setText(job);}
}
}
c'est comment je me connecte Fragment et recyclerview Adaptateur
avec l'interface
public interface FragmentCommunication {
void respond(int position);
}
et ce le Fragment où l'recyclerview est peuplée
public class RecyclerViewFragment extends Fragment {
RecyclerView mRecyclerView;
RecyclerAdapter mRecyclerAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.recycler_fragment,container,false);
mRecyclerView= (RecyclerView) view.findViewById(R.id.recycler);
mRecyclerAdapter=new RecyclerAdapter(getActivity(),getData(),communication);
mRecyclerView.setAdapter(mRecyclerAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return view;
}
public static List<Information> getData() {
List<Information>data=new ArrayList<>();
String[] names={"ahmed","mohammed"};
String[] jobs={"sacsd","csscs"};
for (int i=0;i<names.length;i++){
Information current=new Information();
current.name=(names[i]);
current.job=(jobs[i]);
data.add(current);
}
return data;
}
FragmentCommunication communication=new FragmentCommunication() {
@Override
public void respond(int position) {
FragmentB fragmentB=new FragmentB();
FragmentManager manager=getFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.replace(R.id.dumper,fragmentB).commit();
}
};
}
et ma classe mainActivity est juste d'ajouter le RecyclerViewFragment
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerViewFragment fragment=new RecyclerViewFragment();
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id.dumper,fragment).commit();
}
}
alors, quelle est la bonne façon de lancer fragmentB et de transmettre les données à partir de recyclerview Adaptateur pour fragmentB
- "J'essaie d'utiliser des Faisceaux, mais il donne toujours une valeur "null" s'il vous Plaît nous montrer ce que vous avez essayé.
- Aussi, quelles sont les données que vous souhaitez transmettre?
- J'ai édité le post maintenant
- Est
tv_gob
censé êtretv_job
? - oui ,il est, faire u aucune idée de quel est le problème?
- Je vous ai déjà dit comment le faire. Si vous avez encore des problèmes, vous devez nous dire ce qu'ils sont et de montrer le code pertinent.
Vous devez vous connecter pour publier un commentaire.
merci les gars pour la réponse,j'ai résolu le problème en utilisant une interface avec les valeurs de Chaîne pour connecter l'adaptateur avec le fragment qui contient le recyclerview et l'autre fragment voici ce que j'ai fait exactement :
c'est l'interface
}
et ceci est la carte
}
le fragment qui contient le recyclerview
}
c'est le fragmentB où je reçois les Chaînes à partir de la Carte
}
Si vous travaillez avec kotlin, la solution est beaucoup plus simple.
Réponse originale à cette question ici
passer à la fonction
val itemClick: (Int) -> Unit
à votre carte.Dans votre fragment d'utiliser la valeur retournée
position
La création d'un auditeur de l'interface à la carte ou en utilisant les anciennes méthodes, si je comprends bien votre question correctement.
Vous avez besoin pour passer le Faisceau pour le fragment à travers le setArguments(Bundle args) de la méthode. Puisque vous n'avez pas d'arguments, le bundle vous essayez d'extraire dans votre Fragment résout à null.
Vous avez la bonne idée avec l'aide d'un
Bundle
. Vous avez juste besoin de passer à laFragment
en appelantsetArguments()
. Ensuite, vous pouvez récupérer laBundle
dans votreFragment
avecgetArguments()
.Remarque qu'au lieu de
mList.get(position).name
, vous pouvez le fairecurrent.name
. De même pourjob
.Une autre partie du problème est que vous créez FragmentB sur deux endroits différents. Dans un endroit que vous appelez aussi setArguments (), mais ne montrent pas le fragment. Dans l'autre, vous montrer le fragment, mais ne demandent pas setArguments(). Si vous avez vraiment besoin de le faire à partir de plusieurs parties de votre code, vous devez écrire une méthode pour éviter ces incohérences.