0

У меня есть recyclerView, заполненный фрагментом, и я хочу запустить новый фрагмент и передать данные из адаптера, я пытаюсь использовать Bundles, но он всегда дает нулевое значение этому классу AdapterКак передать данные из Recyclerview в Fragment

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()); 
    } 
} 

и это мой новый фрагмент, который я хочу запустить

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);} 

} 

}

это, как я подключить Fragment и recyclerview адаптер с интерфейсом

public interface FragmentCommunication { 
void respond(int position); 

}

и этого фрагмента, где recyclerview населен

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(); 
    } 

}; 

}

и мой класс mainActivity просто добавить 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(); 
} 

}

так, что это правильный путь для запуска fragmentB и передать данные от recyclerview адаптера к fragmentB

+0

«Я стараюсь использовать Связки но он всегда дает нулевое значение. «Пожалуйста, покажите нам, что вы пробовали. –

+0

Также, какие данные вы хотите передать? –

+0

@ Code-Apprentice Я отредактировал сообщение –

ответ

3

спасибо ребят за ответ, я решил эту проблему, используя интерфейс с строковыми значениями для подключения адаптера с фрагментом, который содержит recyclerview и другой фрагмент здесь является то, что я сделал именно: это интерфейс

public interface FragmentCommunication { 
void respond(int position,String name,String job); 

}

и это это адаптер

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(),mList.get(getAdapterPosition()).name,mList.get(getAdapterPosition()).job); 
    } 
} 

}

фрагмент, содержащий recyclerview

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,String name,String job) { 
     FragmentB fragmentB=new FragmentB(); 
     Bundle bundle=new Bundle(); 
     bundle.putString("NAME",name); 
     bundle.putString("JOB",job); 
     fragmentB.setArguments(bundle); 
     FragmentManager manager=getFragmentManager(); 
     FragmentTransaction transaction=manager.beginTransaction(); 
     transaction.replace(R.id.dumper,fragmentB).commit(); 
    } 

}; 

}

это является fragmentB, где я получаю Струны от адаптера

public class FragmentB extends Fragment { 
TextView textview; 
TextView textview2; 
String name; 
String job; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    name=getArguments().getString("NAME"); 
    job=getArguments().getString("JOB"); 

} 

@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.getName); 
    textview2= (TextView) view.findViewById(R.id.getJob); 
    textview.setText(name); 
    textview2.setText(job); 


    return view; 

} 

}

0

Либо создать интерфейс слушателя в адаптере или с использованием обычных старых методов получения, если я правильно понимаю ваш вопрос.

+0

Я использовал интерфейс, поставил его только решить половину проблемы, я могу открыть фрагмент с помощью интерфейса, но я не могу передать данные –

0

У вас есть правильная идея с использованием Bundle. Вам просто нужно передать его Fragment, позвонив по телефону setArguments(). Затем вы получите Bundle в своем Fragment с getArguments().

Обратите внимание, что вместо mList.get(position).name вы можете сделать current.name. Аналогично для job.

Другая проблема заключается в том, что вы создаете FragmentB в двух разных местах. В одном месте вы также вызываете setArguments(), но не показываете фрагмент. В другом вы показываете фрагмент, но не вызываете setArguments(). Если вам действительно нужно сделать это из нескольких частей вашего кода, вы должны написать метод, чтобы избежать этих несоответствий.

+0

, все еще давая нулевой результат! –

+0

@AhmedEzzat Пожалуйста, будьте более конкретными. Что вы подразумеваете под «нулевым результатом»? Вы получаете сообщение об ошибке? Если да, то какова ошибка и какая строка вашего кода вызывает это? –

+0

@Code_Apprentice if (arguments! = Null) всегда истинно в классе FragmentB –

0

Вам необходимо передать Связывание фрагменту через метод setArguments (Bundle args). Поскольку вы не задали аргументы, пакет, который вы пытаетесь извлечь в своем фрагменте, разрешает null.

+0

Я setArguments(), но он по-прежнему равен нулю –

Смежные вопросы