Android - 从另一个片段中的回收器视图调用片段

Android - call fragment from a recycler view inside another fragment

我有一个应用程序 (Java),它最初有 5 个部分。所有这些都是片段,可以通过底部导航中的 5 个图标访问它们。但是,其中一个部分(课程)现在被另一个包含回收站视图的片段所取代。在这种新设计下,回收站视图中的一项将调用 Lessons 片段。

问题是,如何从包含在新片段中的 Recycler View 中调用 Lessons 片段?

通常在回收站视图中,我会使用如下代码:

    @Override
    public void onClick(View v) {

        int index = getAdapterPosition();
        LessonItem item = lessonList.get(index);

        Intent intent = new Intent(context, SomeActivity.class);

        Bundle bundle = new Bundle();
        bundle.putSerializable("lesson", item);
        intent.putExtras(bundle);

        ((Activity) context).startActivityForResult(intent, 1);

    }

但在这种情况下,我处理的不是 activity。有没有一种方法可以在不必将片段转换为 activity?

的情况下完成此操作

jetpack 中的导航组件更适合处理片段转换

你可以查看这个文档https://developer.android.com/guide/navigation

正如ismailfarisi之前提到的,如果您使用导航组件,它会使转换更容易。

但是,如果您仍想手动管理片段替换,您可以 接口s 作为回调。

interface LessonItemListener {
     void onItemClick(LessonItem item);
}

在您的回收站视图适配器中

class YourAdapter {

   public YourAdapter(LessonItemListener listener) {
       this.listener = listener;
   }

   private LessonItemListener listener;

   ...

   @Override
   public void onClick(View v) {
        int index = getAdapterPosition();
        LessonItem item = lessonList.get(index);
        listener.onItemClick();
   }

}

在你的片段中有 recyclerview

class YourFragment {

     private LessonItemListener listener;

     
     public void setListener(LessonItemListener listener) {
          this.listener = listener;
     }

     private void setupRecyclerView() {
          YourAdapter adapter = new YourAdapter(listener);
          recyclerView.setAdapter(adapter);
     }

}

在您的 Activity 中包含那些片段

class YourActivity extends AppCompatActivity implements LessonItemListener {


    private void setupFragments() {
          YourFragment fragment = new YourFragment();
          fragment.setListener(this);
    }

    ...

    @Override
    public void onItemClick(LessonItem item) {
         //you are in activity now
         //make whatever you want here
         //such as fragment replacement in your bottom nav
    }

}