Violet
Violet

Reputation: 23

How to prevent RecyclerView re-add items causing double of the same list after moving back from a new activity (MVVM)

I am learning RecyclerView in MVVM pattern from a youtube video. I create a recycler view to load very simple items. It works fine, but when I navigate to a new activity and then come back to the activity using Recycler View. My items in the list is duplicated. For example, my recycler view shows 2 items like Item1 and Item2. After I move to a new activity and return back, the list become Item1, Item 2, Item1 and Item2. So, each time I move to the new activity and return back, it keep doubling more and more. I only want the recycler view load one time, how can I solve this problem? Thank you.

My repo:

public class DWCategoryRepository {

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

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

        return instance;
    }

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

        return data;
    }

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

    }

}

My 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;
    }

}

View:

public class MainWalletActivity extends DWBaseActivity implements WalletCategoryAdapter.OnCategoryListener {

    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);
        setSupportActionBar(dataBinding.walletToolbar);

        //Enable Back button on Toolbar
        showBackArrowOnToolbar();

        //Get Categories from View Model
        initCategories();

        //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);

        //Add divider to Recycler view
        mRecyclerView.addItemDecoration(new DividerItemDecoration(MainWalletActivity.this,
                DividerItemDecoration.VERTICAL));

    }

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

Upvotes: 0

Views: 90

Answers (1)

Cory Roy
Cory Roy

Reputation: 5609

You are calling setDWCategories in your getter.

 public MutableLiveData<List<DWCategories>> getDWCategories(){
    setDWCategories(); // <- Remove this line!
    MutableLiveData<List<DWCategories>> data = new MutableLiveData<>();
    data.setValue(dataSet);

    return data;
}

You should only initialize your repo data once. Maybe do it in your getInstance() method if you are ok, starting over every time you run the app.

Upvotes: 1

Related Questions