0

嗨我有一個選項卡布局,通過viewpager膨脹一堆碎片每個片段實例化一堆視圖一切工作正常,但有一個問題,如果我通過幾個片段刷卡,然後刷回碎片通過那裏生命週期脫離和連接和設置導致加倍在其佈局視圖的片段其意見,如何正確處理碎片生命週期中的回收站視圖?

例如:通過一些片段片段顯示5次,滑動和滑動回到同一片段然後示出了10次

我相信它因爲即時設置一切onCreateView我嘗試將設置調用移動到onViewCreated這給了我一個不同的問題,片段和視圖創建正常,但當你刷卡然後回來的意見都沒有了,控制檯告訴我'沒有適配器連接跳過佈局',研究這給我的印象是我需要將我的適配器調用移動到主線程,但我無法得到這個工作空指針無論我儘量能有人指出我在正確的方向,

這裏是我的片段)的主要部分

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 

回答

0

初始化在onCreateView您的意見然後在onActivityCreated中編輯它們。調用getActivity()在onCreateView會導致空指針異常

/** 
    * 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

只是以供將來參考,這似乎是最好的練習,但沒有解決我的問題, –

0

如果您使用的不是ViewPager與選項卡式的活動,請確保您使用的替代(用您的片段交易,不添加()

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

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

此外,我建議您使用viewpager與您的選項卡,因爲它爲您處理交易。如果你不使用ViewPager。

+0

感謝您的投入,我確實使用viewpager並編輯提問內容以反映此感謝@ freekid2000 –

0

我敢肯定這是不是管理這個正確的方式,但它似乎對旋轉和切換標籤工作的非常強力,雖然可以確保該方法只調用一次

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