7

EinführungSpeichern/Aktualisieren Fragment des EditText Daten in einem FragmentStatePagerAdapter

ich eine Aktivität mit einem Buch, das eine Arraylist vom Typ „Seite“ enthält und alle Seiten zu umgehen habe ich beschlossen, eine FragmentStatePagerAdapter zu verwenden, in dem ein meines Fragments enthält eine Seite.

Ich habe eine Schnittstelle für die Kommunikation zwischen jedem Fragment in dem Pager und der Vater Aktivität. Die Methode, die ich in dieser Schnittstelle müssen, ist für die Aktualisierung einer Seite in einem Fragment zeigte, so dass ich für den Empfang der Daten von einem Fragment zum Vater Aktivität, die Schnittstelle implementieren und speichern sie in einer Seite in der Arraylist zu speichern.

Jedes Fragment hat eine EditText in dem der Benutzer schreiben kann, und ich setzte einen addTextChangedListener den Moment zu erwischen, wenn der Benutzer schreiben stoppt. Wenn der Benutzer aufhört, in der EditText im OnTextChanged() zu schreiben, rufe ich die Funktion in der Tätigkeit Vater umgesetzt.

Dies ist mein Aktivitätscode

public class BookEditorActivity implements BookEditorFragment.EditorFrToEditorActInterface { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.book_editor_activity); 

     Bundle extras = getIntent().getExtras(); 
     b = (Book) extras.get("book"); 

     setBookViewPager(b); 

    } 

    private void setBookViewPager(Book b) { 
     mBookViewPager = (ViewPager) findViewById(R.id.book_editor_pager); 
     mBookViewPagerAdapter = new BookViewPagerAdapter(getSupportFragmentManager(), b); 
     mBookViewPager.setAdapter(mBookViewPagerAdapter); 
    } 

    @Override 
    public void saveBookPageTextContent(String textContent) { 

     int current = mBookViewPager.getCurrentItem(); 

     if (b.getPages().get(current) instanceof BookPageText) { 
      ((BookPageText) b.getPages().get(current)).setContentPageText(textContent); 
     } 
    } 

    @Override 
    public void newBookPageText() { 
     int current = mBookViewPager.getCurrentItem(); 

     BookPageText bookPageText = new BookPageText(); 
     bookPageText.setContentPageText(""); 

     b.getPages().add(b.getPages().size() - 1, bookPageText); 

     setIndicator(current + 1, b.getPages().size()); 
     mBookViewPagerAdapter.notifyDataSetChanged(); 

    } 
} 

Dieses das Fragment-Code ist

public class BookEditorFragment extends Fragment { 

    private EditorFrToEditorActInterface mCallback; 

    public interface EditorFrToEditorActInterface { 
     void newBookPageText(); 
     void saveBookPageTextContent(String s); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Bundle pageContent = getArguments(); 
     if (pageContent != null) { 
      page = pageContent.getParcelable("page"); 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (page instanceof BookPageText) { 
      BookPageText bookPage = (BookPageText) page; 

      mView = inflater.inflate(R.layout.book_page_text_fragment, container, false); 
      contentPage = (EditText) mView.findViewById(R.id.content_text); 

      String contentPageText = bookPage.getContentPageText(); 
      contentPage.setText(contentPageText.isEmpty() ? "" : Html.fromHtml(contentPageText)); 

      contentPage.addTextChangedListener(new TextWatcher() { 
       public void onTextChanged(CharSequence c, int start, int before, int count) { 
        mCallback.saveBookPageTextContent(c.toString()); 
       } 

       public void beforeTextChanged(CharSequence c, int start, int count, int after) { 
       } 

       public void afterTextChanged(Editable c) { 
       } 
      }); 

     } 

     return mView; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      mCallback = (EditorFrToEditorActInterface) context; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() 
        + " must implement NewPageInterface"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     mCallback = null; 
     super.onDetach(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.editor_new_text: 
       mCallback.newBookPageText(); 
      break; 
     } 
    } 

} 

Dies ist der FragmentStatePagerAdapter Code

public class BookViewPagerAdapter extends FragmentStatePagerAdapter { 
    private ArrayList<Object> bookPages = new ArrayList<>(); 
    private final SparseArray<WeakReference<BookEditorFragment>> instantiatedFragments = new SparseArray<>(); 

    public BookViewPagerAdapter(FragmentManager fm, Book b) { 
     super(fm); 
     this.bookPages = b.getPages(); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Object page = bookPages.get(position); 

     Bundle pageContent = new Bundle(); 
     if (page instanceof BookPageText) { 
      BookPageText bookPageText = (BookPageText) page; 
      pageContent.putParcelable("page", bookPageText); 
     } 

     BookEditorFragment fragment = new BookEditorFragment(); 
     fragment.setArguments(pageContent); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return bookPages.size(); 
    } 

    @Override 
    public Object instantiateItem(final ViewGroup container, final int position) { 
     final BookEditorFragment fragment = (BookEditorFragment) super.instantiateItem(container, position); 
     instantiatedFragments.put(position, new WeakReference<>(fragment)); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(final ViewGroup container, final int position, final Object object) { 
     instantiatedFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 

    @Nullable 
    public Fragment getFragment(final int position) { 
     final WeakReference<BookEditorFragment> wr = instantiatedFragments.get(position); 
     if (wr != null) { 
      return wr.get(); 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     int position = bookPages.indexOf(object); 
     return position == -1 ? POSITION_NONE : position; 
    } 
} 

Aufgrund der Codelänge ich einige Teile entfernt sind wie die OnClickListener, onPageSelectionListener und andere Arten von Seiten, die ich Recht habe die Schaffung jetzt.

Das Problem

Diese Logik richtig zu funktionieren scheint, aber jedes Mal, dass ich das den Inhalt eines EditText in einem Fragmente ändern wissen, das nahe Fragment nach links wird ebenfalls aktualisiert und ich weiß nicht Warum.

enter image description here
Wie Sie im Bild sehen kann, wenn ich etwas in der EditText2 schreiben, wird der gleiche Inhalt in der EditText1 erscheinen und das macht keinen Sinn.

Ein weiteres Problem ist, wenn ich eine neue Seite im Buch hinzufügen, wird die Seite korrekt erstellt, aber mit dem Inhalt der vorherigen Seite und das macht keinen Sinn. (Wieder!)

Meine Versuche

1) Ich habe versucht, die onFocusChange anstatt die addTextChangedListener zu fangen, aber nichts geändert.

2) Ich habe versucht, eine andere Logik mit der onChangePageListener() zu implementieren, aber in diesem Fall verliere ich die mBookViewPager.getCurrentItem(), so dass das Update schief geht.

3) Ich habe dies alle diese Beiträge versucht: one, two, three und four.

Wie kann ich dieses seltsame Verhalten zu korrigieren? Ist es möglich, dass das Problem in der Art ist, wie ich auf die Seiten in der ArrayList des Buches referenziere?

Dank

+0

Können Sie Link zu Ihrem Code bereitzustellen. Es ist schwer zu replizieren mit dem von Ihnen zur Verfügung gestellten Code –

Antwort

0

Einige der möglichen Fehler, die ich in Ihrem UMSETZEN gefunden sind.

  1. zur aktuellen Seite posetion

    mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
          @Override 
          public void onPageSelected(int p) { 
          current = p; 
          Log.e("Postion", "" + p); 
          } 
    
          @Override 
          public void onPageScrolled(int arg0, float arg1, int arg2) {} 
    
          @Override 
          public void onPageScrollStateChanged(int arg0) {} 
         }); 
    
  2. viewpager automatisch laden privious und nächste Ansicht implementieren verwalten es OffscreenPageLimit durch den Aufruf gesetzt Pager privent mathod

    mViewPager.setOffscreenPageLimit(); 
    
  3. immer darauf achten, dass Wenn Sie die if Anweisung im Adapter verwenden, sollten Sie den Zählerteil immer auf vi setzen eine else Anweisung für jeden Standardwert.

    if (page instanceof BookPageText) { 
        BookPageText bookPageText = (BookPageText) page; 
        pageContent.putParcelable("page", bookPageText); 
    } 
    
+0

Ich habe die Änderungen, die Sie vorgeschlagen, aber nichts geändert ... Ist es möglich, dass das Problem im Modellobjekt ist? Ich habe darüber nachgedacht, weil ich zum Speichern meines Buches eine Klasse erstellt habe, die "Serializable" implementiert, und innerhalb der Klasse habe ich einen Verweis auf eine andere Klasse, die "Serializable" und "Parcelable" implementiert. Jedes Mal, wenn ich ein Buch abrufe und speichere, ist es in/aus der Datei. – michoprogrammer

+0

Ja, es könnte der Fall sein, Sie können Daten über EventBus statt Serializable oder Parcelable übergeben. Wenn Sie diese Daten speichern möchten, verwenden Sie dann Gson, um Ihr Modell in eine Zeichenfolge zu konvertieren und diese Zeichenfolge nach Präferenz zu speichern. Sie können diese Zeichenfolge abrufen und mithilfe von Gson in das Modellobjekt konvertieren. – RBK

+0

Ich habe gestern in einer neuen Filiale die Umstellung auf eine JSON Version gestartet und ich hoffe das wäre die richtige Wahl. Ich weiß nicht, wo ich EventBus verwenden kann oder warum ich EventBus anstelle eines einfachen Pakets verwende. – michoprogrammer

Verwandte Themen