如何从片段中获取数据并将其传输到另一个片段?
How get data from fragment and transfer it to another fragment?
我有 recyclerView class。有些信息我必须分段显示。例如:recyclerView 包含:id、name、surname。我怎样才能让 ID 列表显示在第一个片段中,然后我单击项目 ID,然后在第二个片段中我得到这个 ID 的名字和姓氏?
我的 recyclerView class:
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {
private LayoutInflater inflater;
private List<Source> sources;
public NewsAdapter(Context context, List<Source> sources) {
this.sources = sources;
this.inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public NewsAdapter.NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.news_item, parent, false);
return new NewsViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final NewsViewHolder holder, int position) {
final Source source = sources.get(position);
holder.sourceId.setText(source.getId());
holder.sourceName.setText(source.getName);
holder.sourceSurname.setText(source.getSurname);
}
@Override
public int getItemCount() {
return sources.size();
}
public class NewsViewHolder extends RecyclerView.ViewHolder {
TextView sourceName, sourceId, sourceSurname;
public NewsViewHolder(View view) {
super(view);
sourceName = view.findViewById(R.id.sourceName);
sourceId = view.findViewById(R.id.sourceId);
sourceDescription = view.findViewById(R.id.sourceSurname);
sourceId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("sourceName", sourceName.getText().toString());
bundle.putString("sourceSurname", sourceSurname.getText().toString());
NewsFragment newsFragment = new NewsFragment();
newsFragment.setArguments(bundle);
AppCompatActivity activity = (AppCompatActivity) v.getContext();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment2, newsFragment).addToBackStack(null).commit();
Toast.makeText(itemView.getContext(), "Item clicked. ", Toast.LENGTH_SHORT).show();
}
});
我的第一个片段(我只需要显示 id):
public class IdFragment extends Fragment {
private RecyclerView recyclerView;
private NewsAdapter newsAdapter;
RestClient restClient = new RestClient();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.id_fragment, container, false);
restClient.startRetrofit();
loadJSON();
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
return view;
}
private void loadJSON() {
final Call<News> news = restClient.getApiInterface().getNews();
news.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
List<Source> sources = response.body().getSources();
newsAdapter = new NewsAdapter(getActivity(), sources);
recyclerView.setAdapter(newsAdapter);
}
@Override
public void onFailure(Call<News> call, Throwable t) {
}
});
和我的第二个片段(点击第一个片段后我必须去的地方):
public class NewsFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.details_fragment, container, false);
TextView textView1 = view.findViewById(R.id.sourceName);
TextView textView2 = view.findViewById(R.id.sourceSurname);
Bundle bundle = this.getArguments();
if (bundle != null) {
String sourceName = bundle.getString("sourceName");
textView1.setText(sourceName);
String sourceSurname = bundle.getString("sourceSurname");
textView2.setText(sourceSurname);
}
return view;
}
}
你可以轻松搞定。
我在这件事上使用的方法是使用如下片段构造函数
public class NewsFragment extends Fragment {
String param1,param2;
public NewsFragment(String param1, String param2)
{
this.param1=param1;this.param2=param2;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
.....
return view;
}
}
当您为片段设置构造函数时,它会强制您在需要时提供参数。
还有其他方法,但我发现最好的方法是使用片段构造函数。
我有 recyclerView class。有些信息我必须分段显示。例如:recyclerView 包含:id、name、surname。我怎样才能让 ID 列表显示在第一个片段中,然后我单击项目 ID,然后在第二个片段中我得到这个 ID 的名字和姓氏?
我的 recyclerView class:
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {
private LayoutInflater inflater;
private List<Source> sources;
public NewsAdapter(Context context, List<Source> sources) {
this.sources = sources;
this.inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public NewsAdapter.NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.news_item, parent, false);
return new NewsViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final NewsViewHolder holder, int position) {
final Source source = sources.get(position);
holder.sourceId.setText(source.getId());
holder.sourceName.setText(source.getName);
holder.sourceSurname.setText(source.getSurname);
}
@Override
public int getItemCount() {
return sources.size();
}
public class NewsViewHolder extends RecyclerView.ViewHolder {
TextView sourceName, sourceId, sourceSurname;
public NewsViewHolder(View view) {
super(view);
sourceName = view.findViewById(R.id.sourceName);
sourceId = view.findViewById(R.id.sourceId);
sourceDescription = view.findViewById(R.id.sourceSurname);
sourceId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("sourceName", sourceName.getText().toString());
bundle.putString("sourceSurname", sourceSurname.getText().toString());
NewsFragment newsFragment = new NewsFragment();
newsFragment.setArguments(bundle);
AppCompatActivity activity = (AppCompatActivity) v.getContext();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment2, newsFragment).addToBackStack(null).commit();
Toast.makeText(itemView.getContext(), "Item clicked. ", Toast.LENGTH_SHORT).show();
}
});
我的第一个片段(我只需要显示 id):
public class IdFragment extends Fragment {
private RecyclerView recyclerView;
private NewsAdapter newsAdapter;
RestClient restClient = new RestClient();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.id_fragment, container, false);
restClient.startRetrofit();
loadJSON();
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
return view;
}
private void loadJSON() {
final Call<News> news = restClient.getApiInterface().getNews();
news.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
List<Source> sources = response.body().getSources();
newsAdapter = new NewsAdapter(getActivity(), sources);
recyclerView.setAdapter(newsAdapter);
}
@Override
public void onFailure(Call<News> call, Throwable t) {
}
});
和我的第二个片段(点击第一个片段后我必须去的地方):
public class NewsFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.details_fragment, container, false);
TextView textView1 = view.findViewById(R.id.sourceName);
TextView textView2 = view.findViewById(R.id.sourceSurname);
Bundle bundle = this.getArguments();
if (bundle != null) {
String sourceName = bundle.getString("sourceName");
textView1.setText(sourceName);
String sourceSurname = bundle.getString("sourceSurname");
textView2.setText(sourceSurname);
}
return view;
}
}
你可以轻松搞定。
我在这件事上使用的方法是使用如下片段构造函数
public class NewsFragment extends Fragment {
String param1,param2;
public NewsFragment(String param1, String param2)
{
this.param1=param1;this.param2=param2;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
.....
return view;
}
}
当您为片段设置构造函数时,它会强制您在需要时提供参数。
还有其他方法,但我发现最好的方法是使用片段构造函数。