首页 > 解决方案 > 在 android 上使用 RecyclerView 和 Fragment 时出错

问题描述

我正在尝试制作一个具有 RecyclerView 的应用程序,其中包含删除对象和添加随机数的选项。我要做的是在单击回收器视图列表的任何成员时显示一个片段。我收到错误“java.lang.IllegalStateException:活动已被破坏”。我很确定我做错了什么。我试图做的是在我的 AnimalsAdapter 类上调用 change fragment 方法。我让下面的代码和一个 github 链接。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.berna.recyclerviewtp2, PID: 18705
java.lang.IllegalStateException: Activity has been destroyed
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2114)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:637)
    at com.example.berna.recyclerviewtp2.MainActivity.changeFragment(MainActivity.java:148)
    at com.example.berna.recyclerviewtp2.AnimalsAdapter$1.onClick(AnimalsAdapter.java:81)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我的代码主类changeFragment:

    public void changeFragment(View view){
    Fragment fragment;
    FragmentOne fragmentOne = new FragmentOne();
    fragment = fragmentOne;
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment,fragment);
    ft.addToBackStack(null);
    ft.commit();

FragmentOne 类代码:

public class FragmentOne extends Fragment {
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstaceState){
    //Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_blank,container,false);
}

}

点击监听代码:

        // Set a click listener for TextView
    holder.mTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new MainActivity().changeFragment(view);
            //String animal = mDataSet.get(position);
            //Toast.makeText(mContext,animal,Toast.LENGTH_SHORT).show();
        }
    });

按下recyclerview成员时我必须做什么才能实现片段?

我用来尝试的原始代码

完整项目的 Github 链接

标签: androidandroid-fragmentsandroid-recyclerview

解决方案


你不应该以这种方式实例化你的活动:new MainActivity().changeFragment(view);,它永远不会正确初始化。因此,要么委托侦听器,要么为回调找到另一种解决方法。

例如,为回调创建一个接口:

interface ItemClickListener {
    void onItemClick(View v);
}

让你的 MainActivity 实现接口:

public class MainActivity extends Activity implements ItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        mAdapter = new AnimalsAdapter(mContext, animalsList, this);
        // ...
    }

    @Override
    public void onItemClick(View view) {
        changeFragment(view);
    }
}

然后让您的适配器ItemClickListener作为参数:

private ItemClickListener callback;

public AnimalAdapter(Context context, List<String> data, ItemClickListener callback) {
    this.callback = callback;

并让您holder.mTextView转发回调(返回活动):

holder.mTextView.setOnClickListener(callback::onItemClick);

推荐阅读