首页 > 解决方案 > 将数据从视图寻呼机中的片段传递到已发生的特定操作的前一个片段

问题描述

我已阅读以下文章,

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

  2. 在 View Pager 中的 Fragment 之间传递数据

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

  4. Android:在 viewpager 片段之间传递数据的最佳方法

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

这是我的 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. 当项目被删除时,我想通知父片段回收器视图中的一行已被删除。我正在尝试返回带有 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:

标签: androidandroid-fragmentsandroid-viewpager

解决方案


拥有单个列表对象并从代码中的不同位置对其进行修改不是一个好主意。您应该在 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


推荐阅读