Как предотвратить повторное добавление новых данных в Recycler View после нажатия кнопки «Назад»? - PullRequest
0 голосов
/ 08 января 2020

Я пишу код о RecyclerView, используя шаблон MVVM. Каждый раз, когда я открываю MainWalletActivity, он получает список элементов, вызывая API-интерфейс к серверу. Затем новые элементы будут добавлены в список и отображены в RecyclerView. Например, у меня есть список Элемент 1, Элемент 2 и Элемент 3. После открытия MainWalletActivity эта операция выполнит вызов API, а затем получит новый Элемент 4. Элемент 4 будет добавлен в список. Однако проблема заключается в том, что каждый раз, когда я нажимаю кнопку «Назад», а затем снова открываю MainWalletActivity, список становится «Элемент 1, Элемент 2, Элемент 3, Элемент 4 и Элемент 4». Затем, если я продолжу нажимать кнопку «Назад» и снова открою действие, пункт 4 будет добавлен в мой список. Как я могу предотвратить эту проблему? Потому что по какой-то причине я хочу, чтобы пункт 4 добавлялся только один раз.

Мой репо:

public class DWCategoryRepository {

    private static DWCategoryRepository instance;
    private ArrayList<DWCategories> dataSet = new ArrayList<>();

    public static DWCategoryRepository getInstance() {
        if (instance == null){
            instance = new DWCategoryRepository();
            setDWCategories();
        }

        return instance;
    }

    public MutableLiveData<List<DWCategories>> getDWCategories(){
        MutableLiveData<List<DWCategories>> data = new MutableLiveData<>();
        data.setValue(dataSet);

        return data;
    }

    private void setDWCategories() {
        dataSet.add(new DWCategories("Item1"));
        dataSet.add(new DWCategories("Item2"));

    }
}

Моя ViewModel:

public class MainWalletViewModel extends ViewModel {

    private MutableLiveData<List<DWCategories>> mCategories;
    private DWCategoryRepository mRepo;

    public void init(){
        if (mCategories != null) {
            return;
        }

        mRepo = DWCategoryRepository.getInstance();
        mCategories = mRepo.getDWCategories();
    }

    public LiveData<List<DWCategories>> getDWCategories(){
        return mCategories;
    }

    public void addNewValue(final DWCategories newCategory){
        if (newCategory != null) {
            List<DWCategories> categoryList = mCategories.getValue();
            categoryList.add(newCategory);
            mCategories.postValue(categoryList);
        }
    }
}

MainWalletActivity:

public class MainWalletActivity extends DWBaseActivity {

    private WalletCategoryAdapter mWalletCategoryAdapter;
    private MainWalletViewModel mMainWalletViewModel;
    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initializeDataBinding();

    }

    private void initializeDataBinding() {
        MainWalletActivityBinding dataBinding = DataBindingUtil.setContentView(this, R.layout.main_wallet_activity);

        //Get Categories from View Model
        initCategories();

        //Make api call to get new Item
        makingApiCallToGetNewItem();

        //Set up adapter
        mWalletCategoryAdapter = new WalletCategoryAdapter(this, mMainWalletViewModel.getDWCategories().getValue(), this);

        //Set adapter to Recycler view
        mRecyclerView = dataBinding.walletCategoryRV;
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(mWalletCategoryAdapter);
    }

    private void initCategories(){
        mMainWalletViewModel = ViewModelProviders.of(this).get(MainWalletViewModel.class);
        mMainWalletViewModel.init();
        mMainWalletViewModel.getDWCategories().observe(this, new Observer<List<DWCategories>>() {
            @Override
            public void onChanged(@Nullable List<DWCategories> dwCategories) {
                mWalletCategoryAdapter.notifyDataSetChanged();
            }
        });
    }

    public void makingApiCallToGetNewItem(){
         //Do some stuff to make api call. After api call is made successfully. I added the new item to the list

         mMainWalletViewModel.addNewValue(Item 4);
    }
}

Чтобы решить проблему, я пытаюсь проверить содержит ли текущий список новый элемент 4, чтобы избежать повторного добавления элемента 4 в список после нажатия кнопки «Назад»:

public void addNewValue(final DWCategories newCategory){
            if (newCategory != null) {
                List<DWCategories> categoryList = mCategories.getValue();

                **if (categoryList.contains(newCategory) {**
                     categoryList.add(newCategory);
                     mCategories.postValue(categoryList);
                }      
            }
        }

Однако это не решает проблему. Пункт 4 продолжает добавляться в список каждый раз, когда я нажимаю кнопку «Назад» и снова открываю занятие. Может ли кто-нибудь помочь мне решить мою проблему? Большое спасибо.

...