从新活动移回(MVVM)后如何防止RecyclerView重新添加导致同一列表的两倍的项目

我正在从youtube视频中以MVVM模式学习RecyclerView。我创建了一个回收站视图来加载非常简单的项目。它工作正常,但是当我导航到一个新的活动,然后使用“回收者视图”返回到该活动时。我在列表中的项目重复。例如,我的回收者视图显示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"));

    }

}

我的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 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();
            }
        });
    }
}
nana0124 回答:从新活动移回(MVVM)后如何防止RecyclerView重新添加导致同一列表的两倍的项目

您正在用吸气剂呼叫setDWCategories

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

    return data;
}

您应该只初始化一次您的回购数据。如果可以的话,也许可以在getInstance()方法中进行此操作,从每次运行该应用程序开始。

本文链接:https://www.f2er.com/3155866.html

大家都在问