【问题标题】:How get data from fragment and transfer it to another fragment?如何从片段中获取数据并将其传输到另一个片段?
【发布时间】:2020-10-25 17:54:55
【问题描述】:

我有 recyclerView 类。有些信息我必须以片段的形式显示。例如:recyclerView 包含:id、name、surname。我怎么能在第一个片段中显示 id 列表,然后我点击项目 id 并在第二个片段中我得到这个 id 的名字和姓氏?

我的 recyclerView 类:

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

【问题讨论】:

    标签: android android-recyclerview fragment


    【解决方案1】:

    你可以轻松搞定。

    我为此采用的方法是使用片段构造函数,如下所示

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

    当您为片段设置构造函数时,它将强制您在想要使用它时提供参数。

    还有其他方法,但我发现最好的方法是使用片段构造函数。

    【讨论】:

    • 我必须转移到这一行:NewsFragment newsFragment = new NewsFragment(); ?
    • @Monica NewsFragment newsFragment = new NewsFragment(param1,param2);
    • 也许我做错了什么,它不起作用。在 Fragment 类中:public NewsFragment(String sourceNameItem) { this.sourceNameItem = sourceNameItem; } String sourceNameItem = bundle.getString("sourceName"); 在适配器类中:NewsFragment newsFragment = new NewsFragment(sourceNameItem);
    • 这是我的错误。我为片段做了错误的 xml 布局。现在可以了。谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多