Как предотвратить повторное добавление RecyclerView элементов, вызывающих двойное совпадение списка после возврата из нового действия (MVVM) - PullRequest
0 голосов
/ 06 ноября 2019

Я изучаю RecyclerView в шаблоне MVVM из видео на YouTube. Я создаю представление переработчика для загрузки очень простых предметов. Это работает нормально, но когда я перехожу к новому занятию, а затем возвращаюсь к занятию с помощью Recycler View. Мои элементы в списке дублируются. Например, мой вид переработчика показывает 2 элемента, такие как Item1 и Item2. После того, как я перехожу к новому занятию и возвращаюсь назад, список становится Item1, Item 2, Item1 и Item2. Поэтому каждый раз, когда я перехожу к новому занятию и возвращаюсь назад, оно все больше удваивается. Я хочу только один раз просмотреть представление рециркулятора, как я могу решить эту проблему? Спасибо.

Мой репозиторий:

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

    }

}

Моя модель представления:

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

1 Ответ

1 голос
/ 06 ноября 2019

Вы звоните setDWCategories в своем получателе.

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

    return data;
}

Вы должны инициализировать данные репо только один раз. Возможно, сделайте это в вашем методе getInstance (), если вы в порядке, начиная с каждого запуска приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...