我已阅读以下文章
Passing data back to previous fragment from current fragment
How can I transfer data from one fragment to another fragment android
Android: Best Approach to pass data between viewpager fragments
我还无法弄清楚如何通知父片段在子片段中已删除一行。我的父片段由一个包含多行的回收站视图组成。我想重新渲染(??)回收站视图,但不删除行。任何帮助将不胜感激。
这是我的Github存储库:https://github.com/manoflogan/android-projects/blob/menu/02-Criminalntent/
这是我的用例:
启动应用程序时,用户将看到一个空白视图。 An image of an empty view
如果他们想添加一个新的犯罪对象,他们将点击/点击菜单栏中的+
图标,如上图所示
此操作将生成一个映射到另一个活动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。犯罪对象如下所示创建。
该图像显示已创建的犯罪对象。 Crime object created。当用户按下后退按钮时,这显示了视图,如下所示。 Multiple rows created and displayed after user presses the back button
这是我尝试更新回收站已删除行的方法。 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)
答案 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