【问题标题】:How to start a fragment from a RecyclerView Adapter which is inside another fragment?如何从另一个片段内的 RecyclerView 适配器启动一个片段?
【发布时间】:2017-06-17 17:57:29
【问题描述】:

我有一个包含两个片段的选项卡视图。这两个片段包含一个带有卡片的回收器视图。 两个片段中的每张卡片都有一个按钮。 单击片段 1 的按钮应将片段 2 作为单独的页面打开,反之亦然。 我正在努力寻找一种方法来实现这一点,而不会使每一个都过于复杂和紧密耦合。

这是带有自己适配器的片段一。

这是片段二:

点击 Donees 页面中的 SELECT DONOR 按钮应该会在新页面中打开捐赠者片段,用户可以在其中为选定的受赠者分配捐赠者。

所以我这里有两个需求

1) 从一个片段开始一个片段

2) 跟踪新捐赠者页面是从哪个受赠者打开的,以便我可以为该特定受赠者分配捐赠者。

我希望这是可以理解的。

到目前为止,我已经尝试过 LocalBroadcast 和 FragmentManager,但很难跟踪我对代码所做的工作。

你们能提出更好的技术来实现这一点吗?

【问题讨论】:

  • 使这更复杂的是我必须在回收器视图的适配器中编写所有代码。任何其他解决方法。无需在适配器中填写我的所有代码?

标签: android android-fragments android-recyclerview adapter


【解决方案1】:


最简单的解决方案可能是,启动一个新活动,将 ID、名称或其他内容传递给按钮点击的意图。

Context.startActivity(new Intent(Context, YourAssigneeActivity.class)
                          .putExtra("ID",id));

【讨论】:

    【解决方案2】:

    所以我假设您在单击一个选项卡上的按钮时不会切换到另一个选项卡。因此片段应该填满整个屏幕。

    考虑到这个假设,您很可能必须切换Activity。这可以通过Intent 轻松完成: Intent intent = new Intent(getActivity(), ActivityB.class) intent.putExtra("KEY", <your required data to transfer>); getActivity().startActivityForResult(intent);

    请注意,当您使用putExtra() 时,不要忘记您需要在这些对象中实现Parcelable (explained here)

    要了解点击了哪个项目,您可以使用以下模式(伪代码 - 我个人认为它非常干净):

    FragmentA implements YourAdapter.callback {
       onItemClicked(<YourObject> item) {
           <starting new activity as described above>
       }
    }
    class YourAdapter extends RecyclerView.Adapter {
         Callback mCallback;
    
         YourAdapter(Context context, otherStuff) {
             mCallback = (Callback) context;
         }
    
         interface Callback {
             onItemClicked(<YourObject> item)
         }
    
         YourViewHolder implements View.OnClickListener {
              onClick(View v) {
                  mCallback.onItemClicked(<YourObject> item)
              }
         }
    }
    

    进入 Activity 后,您可以在 Activity 的 onCreate() 中设置 Fragment。在创建 Fragment 之前,在 Activity 中使用 onCreate 中的getIntent() 检索数据。然后您可以将您的数据放入带有setArguments(&lt;Bundle&gt;) 的片段中。在 onCreateview() 的 Fragment 中使用 getArguments() 检索它。

    我知道这有点复杂。更好的解决方案是只切换到 Activity 并忘记 Fragment。这将消除一层复杂性。

    如果您直接从 Fragment 转到 Fragment,则可以忽略 Activity 部分,但其余部分应保持不变。

    希望这是您正在寻找的答案!

    编辑:请注意,如果 Activity 未实现 Callback,则 mCallback = (Callback) context 为 null

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2018-10-11
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多