将数据从视图寻呼机中的片段传递到已发生的特定操作的前一个片段



我已经阅读了以下文章,

  1. 将数据从当前片段传递回上一个片段

  2. 在视图寻呼机中的片段之间传递数据

  3. 如何将数据从一个片段传输到另一个片段安卓

  4. Android:在视图寻呼机片段之间传递数据的最佳方法

我一直不知道如何通知父片段,子片段中的一行已经删除。我的父片段由一个具有多行的回收器视图组成。我想重新发送(??)不包含已删除行的回收器视图。如有任何帮助,我们将不胜感激。

这是我的Github回购:https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/

这是我的用例:

  1. 当应用程序启动时,用户将看到一个空视图。空视图的图像

  2. 如果他们想添加一个新的犯罪对象,他们会点击/点击菜单栏中的+图标,如前一张所示

  3. 此操作生成映射到另一个活动的意图https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/krishnanand/criminalintent/CrimeListFragment.java#L67.

  4. 这加载了一个活动,在该活动中定义了ViewPager,并在其中关联了一个片段https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/app/src/main/java/com/krishnanand/criminalintent/CrimePagerActivity.java#L60.犯罪对象的创建方式如下所示。

图像显示已创建的犯罪对象。犯罪对象已创建。这将显示用户按下后退按钮时的视图,如下所示。用户按下后退按钮后创建并显示多行

  1. 当项目被删除时,我想通知父片段,回收器视图中的一行已经被删除。我正试图用回收者视图返回碎片。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.krishnanad.criminate E/AndroidRuntime:致命例外:主流程:com.krishnanand.clinicintent,PID:13876java.lang.IndexOutOfBoundsException:检测到不一致。无效的视图支架适配器位置视图支架{6d1120f位置=1 id=-1,oldPos=1,pLpos:-1废料[attachedScreap]tmp未分离父级}android.support.v7.widget.CyclerView{4220554 VFED……ID0,0-10801584#7f070032-app:id/crime_recycler_view},适配器:com.krishnanad.crimitiintt.CrimeListFragment$CrimeAdapter@3140cfd,布局:android.support.v7.widget.LinearLayoutManager@42ccdf2,上下文:com.krishnanand.criminalintent.CrimeListActivity@95fdd1a位于android.support.v7.widget.CyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)在android.support.v7.widget.CyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)在android.support.v7.widget.CyclerView$Recycler.getViewForPosition(RecyclerView.java:55858)位于android.support.v7.widget.CyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)在android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)在android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)位于android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)在android.support.v7.widget.CyclerView.dispatchLayoutStep1(RecyclerView.java:3875)在android.support.v7.widget.CyclerView.dispatchLayout(RecyclerView.java:3639)位于android.support.v7.widget.CyclerView.consumerPendingUpdateOperations(RecyclerView.java:1877)在android.support.v7.widget.CyclerView$1.run(RecyclerView.java:407)在android.view.Cchoreographer$CallbackRecord.run(Choreographer.java:949)在android.view.Cchoreographer.doCallbacks(Choreographer.java:761)位于android.view.Cchoreographer.doFrame(Choreographer.java:693)位于android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)在android.os.Handler.handleCallback(Handler.java:873)在android.os.Handler.dispatchMessage(Handler.java:99)在android.os.Looper.loop(Looper.java:193)在android.app.ActivityThread.main(ActivityThreads.java:6669)位于java.lang.reflect.Method.ioke(本机方法)网址:com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:858)

使用单个列表对象并从代码中的不同位置对其进行修改不是一个好主意。不应该在适配器的构造函数中传递List,而应该在CrimeAdapter中创建一个名为setCrimes(List crime)的方法。

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在碎片之间共享数据。

https://developer.android.com/reference/android/arch/lifecycle/ViewModelhttps://developer.android.com/topic/libraries/architecture/livedata

最新更新