Передача данных из фрагмента в пейджере представления к предыдущему фрагменту определенного действия, которое имело место - PullRequest
0 голосов
/ 24 ноября 2018

Я прочитал следующие статьи,

  1. Передача данных назад к предыдущему фрагменту из текущего фрагмента

  2. Передача данных между фрагментами в View Pager

  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. Объект преступления создается, как показано здесь.

На рисунке показан созданный объект преступления. Создан объект преступления .Это показывает вид, когда пользователь нажимает кнопку возврата, как показано ниже. Несколько строк, созданных и отображаемых после нажатия кнопки возврата

Когда элемент удален, я хочу сообщить родительскому фрагменту, что строка в представлении переработчика была удалена.Я пытаюсь вернуться к фрагменту с Recycler View здесь.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 EXCEPTION: main Процесс: com.krishnanand.criminalintent, PID: 13876 java.lang.IndexOutOfBoundsException: Обнаружено несоответствие.Неверный адаптер держателя вида positionViewHolder {6d1120f position = 1 id = -1, oldPos = 1, pLpos: -1 scrap [attachScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView {4220554 VFED ..... ...... ID 0,0-1080,1584 # 7f070032 приложение: id / crime_recycler_view}, адаптер: com.krishnanand.criminalintent.CrimeListFragment$CrimeAdapter@3140cfd, макет: android.support.v7.widget.LinearLayoutManager@42ccdf2, контекст: com.krishnanand.criminalintent.CrimeListActivity@95fdd1a по адресу android.support.v7.widget.RecyclerView $ Recycler.validateViewHolderForOffsetPosition (RecyclerView.java:5715) в android.support.v7.widget.RecyclereBe ReReGlerDeBellingReHellingReg_ReclerDayBence: RecyclerDeBell_ReclerDayPlay_ReclerDayPlay_ReclerDayPlay Reception5898) на 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.renayanManagerMonLayManagerMonLayManagerMonLayManagerMonLayManagerMonLayManagerMonLayManagerMonLayO.support.v7.widget..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 голосов
/ 24 ноября 2018

Не очень хорошая идея иметь один объект списка и изменять его из разных мест в коде.Вместо того, чтобы передавать 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;
    }
  }

Обычно вам нужно создать копию List и внести изменения вто есть добавить, удалить и т. д., а затем установить этот список.

Вы можете использовать ViewModel и LiveData для обмена данными между вашими фрагментами.

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

...