【问题标题】:Losing data on fragment change丢失片段更改的数据
【发布时间】:2018-04-25 11:16:14
【问题描述】:

你能帮我解决这个问题吗?

我有一个底部导航栏的活动,它改变了中间的片段。其中一个选项是使用选项卡显示分为 2 组的项目列表。 在我第一次打开片段时,所有数据都按预期存在,但是我更改片段并再次使用列表调用片段的 newInstance,所有数据都消失了。请查看下面的 GIF 以更好地理解:

下面是设置标签的代码:

 private void setViewPager(){
        List<Fragment> frag = new ArrayList<>();
        frag.add(MyReservationsFragment.newInstance(true));
        frag.add(MyReservationsFragment.newInstance(false));

        MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter(getFragmentManager(), frag, getContext());
        vpaReservations.setAdapter(myViewPagerAdapter);
        tabReservations.addTab(tabReservations.newTab().setText(getString(R.string.s_tab_1)));
        tabReservations.addTab(tabReservations.newTab().setText(getString(R.string.s_tab_2)));
        tabReservations.setupWithViewPager(vpaReservations);
    }

下面是我如何实例化每个片段:

public class MyReservationsFragment extends Fragment implements MyReservationsContract.View{

    private static final String TAG = "MyResFrag";
    private static final String ONLY_PENDING = "onlyPending";
    private static final String RESERVATION_ID = "reservationId";

    @BindView(R.id.rvi_my_reservations) protected RecyclerView rviMyReservations;

    private boolean onlyPending;
    private MyReservationsContract.Presenter mPresenter;


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

    public static MyReservationsFragment newInstance(boolean onlyPending) {
        MyReservationsFragment frag = new MyReservationsFragment();
        Bundle args = new Bundle();
        args.putBoolean(ONLY_PENDING, onlyPending);
        frag.setArguments(args);

        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            onlyPending = getArguments().getBoolean(ONLY_PENDING);
        }

        mPresenter=new MyReservationsPresenter();

    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag_reservations_list, container, false);
        ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
//        List<MyReservation> myReservations = Const.getMyReservations(onlyPending);

        List<Reservation> myReservations = mPresenter.getUserReservationsByStatus(onlyPending);
        setRecyclerView(myReservations);
    }

    private void setRecyclerView(final List<Reservation> myReservations){
        rviMyReservations.setHasFixedSize(true);
        LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        rviMyReservations.setLayoutManager(mLayoutManager);

        MyReservationAdapter mAdapter = new MyReservationAdapter(myReservations,getContext());
        mAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = rviMyReservations.getChildLayoutPosition(view);
                Intent intent = new Intent(getActivity(), ReservationDetailActivity.class);
                intent.putExtra(RESERVATION_ID, myReservations.get(position).getId());
                startActivity(intent);
            }
        });

        rviMyReservations.setAdapter(mAdapter);
        rviMyReservations.setItemAnimator(new DefaultItemAnimator());
    }


}

我已经尝试保存“onlyPending”变量的标志,但由于片段没有被破坏,它具有相同的行为。我已经卡了2天了,你们能帮帮我吗?

【问题讨论】:

    标签: android fragment tabview


    【解决方案1】:

    不要每次都使用 new 运算符创建实例,片段的新对象将被创建,旧数据将消失。所以像这样创建,

    片段类中的第一个:

      public static  MyReservationsFragment frag;
    

    在newInstance方法中:

    public static MyReservationsFragment newInstance(boolean onlyPending) {
        if(frag == null)
        {
             frag = new MyReservationsFragment();
        }
    
        Bundle args = new Bundle();
        args.putBoolean(ONLY_PENDING, onlyPending);
        frag.setArguments(args);
    
        return frag;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多