android - 在 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成员时我必须做什么才能实现片段?
解决方案
你不应该以这种方式实例化你的活动: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);
推荐阅读
- wordpress - Wordpress 单一安装在子目录站点地图重写规则 Nginx
- typescript - 泛型和映射类型缩小
- xml - XSD:独特的元素
- java - 使用 BouncyCastle 接受过期的 CRL
- .net - 缓存从 ASP.NET 核心 Web api 中的大量文件中读取的内容
- bash - 阅读默认网关的路由表?
- sql - 如何在 SQL Server 中将 YYYY-MM-DD HH:MM:SS 转换为 MM-DD-YYYY HH:MM:SS?
- android - Espresso 无法启动其他活动
- c++ - 从线程执行成员方法时出现分段错误
- angular - 检测 @ViewChild() 中的值何时发生变化