【问题标题】:how to properly handle recycler view in a fragments lifecycle?如何在片段生命周期中正确处理回收者视图?
【发布时间】:2016-05-08 09:10:42
【问题描述】:

嗨,我有一个选项卡布局,它通过 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

【问题讨论】:

    标签: android android-fragments android-recyclerview android-lifecycle


    【解决方案1】:

    在 onCreateView 中初始化您的视图,然后在 onActivityCreated 中编辑它们。 onCreateView中调用getActivity()会导致空指针异常

       /**
         * 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();
            }
        }
    

    【讨论】:

    • 仅供参考,这似乎是最佳做法,但不能解决我的问题,
    【解决方案2】:

    如果您没有在选项卡式活动中使用 ViewPager,请确保您在片段事务中使用 replace(),而不是 add()

    Fragment fragment = new Fragment();
    FragmentManager fragmentManager = getFragmentManager();
    
    fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).commit();
    

    另外,我建议您在标签中使用查看页面,因为它会为您处理事务。如果您不使用 ViewPager,那就是。

    【讨论】:

    • 感谢您的意见,我确实在使用浏览器,并将编辑问题内容以反映这一点,谢谢@freekid2000
    【解决方案3】:

    我确定这不是管理此问题的正确方法,但它似乎适用于旋转和切换选项卡,虽然确保该方法只被调用一次,但它非常暴力

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      相关资源
      最近更新 更多