将数据从视图分页器中的片段传递到已发生的特定操作的先前片段

时间:2018-11-24 05:04:22

标签: android android-fragments android-viewpager

我已阅读以下文章

  1. Passing data back to previous fragment from current fragment

  2. Passing data between Fragments in View Pager

  3. How can I transfer data from one fragment to another fragment android

  4. Android: Best Approach to pass data between viewpager fragments

我还无法弄清楚如何通知父片段在子片段中已删除一行。我的父片段由一个包含多行的回收站视图组成。我想重新渲染(??)回收站视图,但不删除行。任何帮助将不胜感激。

这是我的Github存储库:https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/

这是我的用例:

  1. 启动应用程序时,用户将看到一个空白视图。 An image of an empty view

  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。犯罪对象如下所示创建。

该图像显示已创建的犯罪对象。 Crime object created。当用户按下后退按钮时,这显示了视图,如下所示。 Multiple rows created and displayed after user presses the back button

  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.krishnanand.criminalintent E / AndroidRuntime:FATAL   例外:主要程序:com.krishnanand.criminalintent,PID:13876   java.lang.IndexOutOfBoundsException:检测到不一致。无效   视图支架适配器positionViewHolder {6d1120f position = 1 id = -1,   oldPos = 1,pLpos:-1废料[attachedScrap] tmpDetached没有父级}   android.support.v7.widget.RecyclerView {4220554 VFED ..... ...... ID   0,0-1080,1584#7f070032 app:id / crime_recycler_view},   adapter:com.krishnanand.criminalintent.CrimeListFragment$CrimeAdapter@3140cfd,   布局:android.support.v7.widget.LinearLayoutManager@42ccdf2,   context:com.krishnanand.criminalintent.CrimeListActivity@95fdd1a       在android.support.v7.widget.RecyclerView $ Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)       在android.support.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)       在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5858)       在android.support.v7.widget.RecyclerView $ 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.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)       在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)       在android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1877)       在android.support.v7.widget.RecyclerView $ 1.run(RecyclerView.java:407)       在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:949)       在android.view.Choreographer.doCallbacks(Choreographer.java:761)       在android.view.Choreographer.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(ActivityThread.java:6669)       在java.lang.reflect.Method.invoke(本机方法)       在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 个答案:

答案 0 :(得分:0)

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

do_fetch (12251): log.do_fetch.12251
do_prepare_recipe_sysroot (12440): log.do_prepare_recipe_sysroot.12440
do_unpack (13072): log.do_unpack.13072
do_patch (14329): log.do_patch.14329
do_configure (15730): log.do_configure.15730
do_compile (4380): log.do_compile.4380
do_mkimage (10675): log.do_mkimage.10675
do_install (10749): log.do_install.10749
do_package (11298): log.do_package.11298
do_packagedata (6787): log.do_packagedata.6787
do_package_write_rpm (27291): log.do_package_write_rpm.27291

通常,您需要创建列表的副本并对其进行修改,即添加,删除等,然后设置该列表。

您可以使用ViewModel和LiveData在Fragment之间共享数据。

SentiBench https://developer.android.com/reference/android/arch/lifecycle/ViewModel