使用 OnClick 在 RecyclerView 中调用 Fragman 事务

Call a Fragmant Transaction within a RecyclerView using OnClick

我想使用 onClick() 将一个 Fragment 替换为另一个 Fragment。我的问题是,我收到这样的错误:

java.lang.IllegalStateException: Activity has been destroyed

我的主要活动:

private static MainActivity instance = new MainActivity();

public static MainActivity getInstance() {
    return instance;
}

public void displayView() {
    fragment = new PlaylistFragment();
    FragmentManager fm = getSupportFragmentManager();
      if(fm.getBackStackEntryCount() != 0) {
          fm.popBackStack(fm.getBackStackEntryAt(0).getName(), 
          FragmentManager.POP_BACK_STACK_INCLUSIVE);
      }
    fm.beginTransaction().replace(R.id.frame_container, fragment,  
    fragment.toString()).commit();
 }

布局:

Activity_main.xml:
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Framelayout to display Fragments -->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <!-- Listview to display slider menu -->
    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/list_divider"
        android:dividerHeight="1dp"        
        android:listSelector="@drawable/list_selector"
        android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>

我的片段的 ListAdapter: 在 onBindViewHolder 方法中:

View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder)  
            view.getTag();

            int position = holder.getLayoutPosition();
            System.out.println("CLICK");
            Artist artist = artists.get(position);

            MainActivity instance = MainActivity.getInstance();
            instance.displayView();

        }
    };

所以 onClickListener 工作正常,但我得到 IllegalStateException。 我调试了它并在 FragmentManager Class 中抛出错误,因为 "mHost" 似乎为空:

 public void enqueueAction(Runnable action, boolean allowStateLoss) {
        if (!allowStateLoss) {
            checkStateLoss();
        }
        synchronized (this) {
            if (mDestroyed || mHost == null) {
                throw new IllegalStateException("Activity has been destroyed");
            }

提前致谢。

为什么使用private static MainActivity instance = new MainActivity();。实例应该在 onCreate() 方法中,如下所示:

private static MainActivity instance = this;

它在您的 onClick 方法中创建新的 activity :

MainActivity instance = MainActivity.getInstance();
            instance.displayView();