Список данных дублируется после перехода к другому фрагменту (скользящая вкладка)

Есть 3 вкладки: ОДИН || ДВА || TRI

пример: myList = 1,2,3

выпуск:

после того, как я перехожу на страницу 2 myList = 1,2,3,1,2,3 (двойной дубликат)

если я пойду на страницу TRI myList = 1,2,3,1,2,3,1,2,3 (тройной дубликат)

после того как я искал решение в интернете, я нашел этот код (в классе адаптера):

   public void swap(List<FoodModel> datas){
        datas = new ArrayList<>();//updated
        if(mListFood !=null || mListFood.size() !=0){
            mListFood.clear();
            mListFood.addAll(datas);
        }else{
            mListFood = datas;
        }
        notifyDataSetChanged();
    }

я использовал это в oneFragment.java:

   mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel);
        mListFoodAdapter.swap(mFoodModel);
        mRecyclerViewListFood.setLayoutManager(linearLayoutManager);
        mRecyclerViewListFood.setAdapter(mListFoodAdapter);
        mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator());

но это дало мне nullPointer иногда нет данных в RecyclerView

Пожалуйста, предложите мне, как сделать так, чтобы данные списка больше не дублировались после возвращения со страницы ДВУХ ТРИ

ниже мои коды oneFragment.java а также ViewPagerAdapter.java

oneFragment.java

public class FoodFragment extends Fragment {

    private RecyclerView mRecyclerViewListFood;
    private List<FoodModel> mFoodModel = new ArrayList<>();
    private ListFoodAdapter mListFoodAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_foods, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        FragmentActivity fragmentActivity = getActivity();
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(fragmentActivity);
        mRecyclerViewListFood = (RecyclerView) view.findViewById(R.id.recyclerView_list_foods);
        mFoodModel.add(new FoodModel("1",String.valueOf(R.drawable.icon), "test 1"));
        mFoodModel.add(new FoodModel("2",String.valueOf(R.drawable.icon), "test 2"));

        mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel);
        mRecyclerViewListFood.setLayoutManager(linearLayoutManager);
        mRecyclerViewListFood.setAdapter(mListFoodAdapter);
        mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator());



    }
}

ViewPagerAdapter.java:

public class ViewPagerDetailStandAdapter extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerDetailStandAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

2 ответа

Просто используйте этот метод, чтобы очистить ваши данные фрагмента.

@Override
public void onDestroyView() {
    super.onDestroyView();
    tutPojo.clear();
}

В тебе проблема onViewCreated() метод. Метод OnViewCreated() вызывается каждый раз после создания представления фрагмента. Но фрагмент используется повторно, если он находится в памяти. Это причина того, что ваш mFoodModel список не будет повторно инициализирован. Так что вам нужно переинициализировать mFoodModel создать предыдущие данные.

Так что это ваш модифицированный OnCreateView()`

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    FragmentActivity fragmentActivity = getActivity();
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(fragmentActivity);
    mRecyclerViewListFood = (RecyclerView) view.findViewById(R.id.recyclerView_list_foods);
    mFoodModel = new ArrayList<>(); // initialize you list
    mFoodModel.add(new FoodModel("1",String.valueOf(R.drawable.icon), "test 1"));
    mFoodModel.add(new FoodModel("2",String.valueOf(R.drawable.icon), "test 2"));

    mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel);
    mRecyclerViewListFood.setLayoutManager(linearLayoutManager);
    mRecyclerViewListFood.setAdapter(mListFoodAdapter);
    mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator());
}
Другие вопросы по тегам