0

Hallo Ich habe ein Tab-Layout, das eine Reihe von Fragmenten durch einen Viewpager aufbläht jedes Fragment instanziiert eine Reihe von Ansichten alles funktioniert gut, aber es gibt ein Problem, wenn ich durch ein paar Fragmente wischen und dann die Fragmente zurück durch den Lebenszyklus gehen wird abgenommen und angebracht und seine Ansichten in dem Fragmente ergebenden die Ansichten in ihrem Layout Verdopplungs Einrichtung,Wie kann die Recycleransicht in einem Fragmentlebenszyklus richtig gehandhabt werden?

zB: Fragment zeigt 5 Ansichten, Streich durch einige Fragmente und Swipe zurück gleiches Fragment zeigt dann 10 Ansichten

ich glaube Es ist, weil ich alles in OnCreateView gesetzt habe ich versuchte, die Setup-Aufrufe auf OnViewCreated zu verschieben, die mir ein anderes Problem gibt, das Fragment und die Ansichten sind in Ordnung, aber wenn Sie aw wischen AY und dann zurück sind die Ansichten weg und die Konsole sagt mir, dass kein Adapter das Layout überspringt. Das Nachforschen brachte mir den Eindruck, dass ich meine Adapteraufrufe in den Hauptthread verschieben musste jemand mich in die richtige Richtung zeigen kann versuchen,

hier ist der wichtigste Teil meines Fragment

public class OneFragment extends Fragment{ 

public static List<CardWriter> cardMakerList = new ArrayList<>(); 
private RecyclerView recyclerView; 
private GridLayoutManager staggeredGridLayoutManagerVertical; 
public static CardAdapter cardAdapter; 

public OneFragment() { 
    // Required empty public constructor 
} 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate 
    (R.layout.fragment_one, container, false); 
    RecyclerView.LayoutManager staggeredGridLayoutManagerVertical = new 
    StaggeredGridLayoutManager(4,LinearLayoutManager.VERTICAL); 
    recyclerView = (RecyclerView) rootView.findViewById(R.id.card_grid); 
    cardAdapter = new CardAdapter(cardMakerList); 
    recyclerView.setLayoutManager(staggeredGridLayoutManagerVertical); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(cardAdapter); 
    recyclerView.addOnItemTouchListener(new 



    RecyclerTouchListener(getActivity().getApplicationContext(),  
    recyclerView, new ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
    CardWriter cardWriter = cardMakerList.get(position); 
    SpeakGrid.cardMakerList.add(SpeakGrid.cardMakerList.size(),cardWriter); 
    SpeakGrid.cardAdapter.notifyItemInserted(SpeakGrid.cardMakerList.size()); 
    SpeakRecyclerGrid.cardMakerList.add 
    (SpeakRecyclerGrid.cardMakerList.size(),cardWriter); 
    SpeakRecyclerGrid.cardAdapter.notifyItemInserted 
    (SpeakGrid.cardMakerList.size()); 
      Snackbar.make(view, "This card is " + 
    cardWriter.getCardEmotion() + " and it would say " + 
    cardWriter.getCardEmotion(), Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 

     } 

     ive been going through and debugging this and it was also happening while rotating so im now using if (savedinstance state == null) to solve the issue with rotating but it must be lost when scrolling because it still happens if i scroll more than one away and come back the cards in the view have doubled 

Antwort

0

Init Ihre Ansichten in onCreateView genannt Bearbeiten Sie sie dann in onActivityCreated. Der Aufruf getActivity() in onCreateView Ausnahmen Null-Zeiger verursachen können

/** 
    * Called to have the fragment instantiate its user interface view, can be 
    * null for non-graphical fragments Called after onCreate(Bundle) and 
    * beforeonActivityCreated(Bundle). 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_one, container, false); 
     RecyclerView.LayoutManager staggeredGridLayoutManagerVertical = new 
     StaggeredGridLayoutManager(4,LinearLayoutManager.VERTICAL); 
     recyclerView = (RecyclerView) rootView.findViewById(R.id.card_grid); 
     return rootView; 
    } 

    /** 
    * Called when the fragment's activity has been created and this fragment's 
    * view hierarchy instantiated. Called after onCreateView(Bundle) and before 
    * onViewStateRestored(Bundle). 
    */ 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     cardAdapter = new CardAdapter(cardMakerList); 
     recyclerView.setLayoutManager(staggeredGridLayoutManagerVertical); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(cardAdapter); 

     recyclerView.addOnItemTouchListener(new 
     RecyclerTouchListener(getActivity().getApplicationContext(),  
     recyclerView, new ClickListener() { 
      @Override 
      public void onClick(View view, int position) { 
      CardWriter cardWriter = cardMakerList.get(position); 
      SpeakGrid.cardMakerList.add(SpeakGrid.cardMakerList.size(),cardWriter); 
      SpeakGrid.cardAdapter.notifyItemInserted(SpeakGrid.cardMakerList.size()); 
      SpeakRecyclerGrid.cardMakerList.add 
      (SpeakRecyclerGrid.cardMakerList.size(),cardWriter); 
      SpeakRecyclerGrid.cardAdapter.notifyItemInserted 
      (SpeakGrid.cardMakerList.size()); 
        Snackbar.make(view, "This card is " + 
      cardWriter.getCardEmotion() + " and it would say " + 
      cardWriter.getCardEmotion(), Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
     } 
    } 
+0

nur für die Zukunft dieses Beste zu sein scheint Übung, aber löst mein Problem nicht, –

0

Wenn Sie keine ViewPager mit Tabbed-Aktivität verwenden, stellen Sie sicher, dass Sie ersetzen verwenden() mit Ihre Fragmenttransaktionen, nicht hinzufügen()

Fragment fragment = new Fragment(); 
FragmentManager fragmentManager = getFragmentManager(); 

fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).commit(); 

Außerdem empfehle ich, dass Sie einen Viewpager mit Ihren Tabs verwenden, da er die Transaktionen für Sie abwickelt. Wenn Sie ViewPager nicht verwenden, ist dies der Fall.

+0

Dank für Ihre Eingabe, ich in der Tat ein viewpager bin mit und wird die Frage Inhalt bearbeiten dies dank zu reflektieren @ freekid2000 –

0

im sicher, dass dies nicht der richtige Weg, dies zu bewerkstelligen, aber es scheint, obwohl die Arbeit zum Drehen und Wechseln der Reiter seine sehr Brute-Force stellt sicher, dass das Verfahren nur einmal

if (bool == false) { 
     prepareCardData(); 
     bool = true; 
    }; 
Verwandte Themen