android - 将数据从视图寻呼机中的片段传递到已发生的特定操作的前一个片段
问题描述
我已阅读以下文章,
我无法弄清楚如何通知父片段子片段中的一行已被删除。我的父片段由一个多行的回收器视图组成。我想重新渲染(??)没有删除行的回收器视图。任何帮助,将不胜感激。
这是我的 Github 存储库:https ://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/
这是我的用例:
当应用程序启动时,用户将看到一个空视图。空视图的图像
如果他们想添加新的犯罪对象,他们将单击/点击
+
菜单栏中的图标,如上图所示此操作生成映射到另一个活动的意图https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/krishnanand/criminalintent/CrimeListFragment.java#L67 .
这将加载一个定义 ViewPager 的活动,并在其中关联一个片段 https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/ krishnanand/criminalintent/CrimePagerActivity.java#L60。犯罪对象的创建如下所示。
图像显示已创建的犯罪对象。 犯罪对象已创建。这显示了用户按下后退按钮时的视图,如下所示。 用户按下后退按钮后创建并显示多行
- 当项目被删除时,我想通知父片段回收器视图中的一行已被删除。我正在尝试返回带有 Recycler View 的 Fragment。https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/krishnanand/criminalintent/CrimeFragment.java#L81
这是我尝试更新已删除行的回收器的方法。https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/krishnanand/criminalintent/CrimeListFragment.java#L110
如果我有 N 行,并且如果我想删除除最后一行之外的任何行,则应用程序崩溃并出现以下错误。
---------崩溃开始 2018-11-23 17:40:49.932 13876-13876/com.krishnanand.criminalintent E/AndroidRuntime:致命异常:主进程:com.krishnanand.criminalintent,PID:13876 java.lang.IndexOutOfBoundsException:检测到不一致。无效的视图支架适配器 positionViewHolder{6d1120f position=1 id=-1, oldPos=1, pLpos:-1 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{4220554 VFED..... ....ID 0,0-1080,1584 #7f070032 app:id/crime_recycler_view},适配器:com.krishnanand.criminalintent.CrimeListFragment$CrimeAdapter@3140cfd,布局:android.support.v7.widget.LinearLayoutManager@42ccdf2,上下文:com.krishnanand.criminalintent.CrimeListActivity@95fdd1a at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:
解决方案
拥有单个列表对象并从代码中的不同位置对其进行修改不是一个好主意。您应该在 CrimeAdapter 中创建一个名为 setCrimes(List crime) 的方法,而不是在适配器的构造函数中传递 List。
private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
private List<Crime> mCrimes;
public void setCrimes(List<Crime> crimes){
this.crimes = crimes;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mCrimes != null ? mCrimes.size() : 0;
}
}
通常您需要创建列表的副本并对其进行修改,即添加、删除等,然后设置该列表。
您可以使用 ViewModel 和 LiveData 在 Fragment 之间共享数据。
https://developer.android.com/reference/android/arch/lifecycle/ViewModel https://developer.android.com/topic/libraries/architecture/livedata
推荐阅读
- android - 检测Webview android中的URL更改
- java - 非拉丁字符显示为“?”
- python - Model gives same output, accuracy, loss for all inputs (keras)
- go - 如何使用 Go 在嵌套 JSON 中进行多步搜索
- angular - Angular material MatDialog.open(Component) automatically selects first link of Component
- python - 如何从 python 中的幅度数据创建 .wav 文件?
- java - Aggregate sql query not working if select statement contains columns of type DATE
- ghostscript - Ghostscript How to watermark one special page of a postscript document?
- css - div clip path according to the parent rectangle
- arrays - dict type numpy.AxisError: 轴 -1 超出了维度为 0 的数组的范围