Я пишу код о 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 продолжает добавляться в список каждый раз, когда я нажимаю кнопку «Назад» и снова открываю занятие. Может ли кто-нибудь помочь мне решить мою проблему? Большое спасибо.