gpt4 book ai didi

Android MVP架构——repository和view之间的通信

转载 作者:行者123 更新时间:2023-11-30 00:48:55 25 4
gpt4 key购买 nike

我正在学习给定 here 的 Android MVP 架构.基于这个例子,我创建了自己的简单应用程序,它只显示带有 recyclerview 的列表。具有下拉刷新功能。

当列表被拉出时,我想首先清除 recyclerview,然后再次从存储库重新加载数据(假延迟)。但是,当我清除 RecyclerViewAdpater 中的数据时,存储库中的所有数据也被清除,没有任何内容可显示。我只是不明白原因。

这是我创建 Presenter 和 View(即 Fragment)的 Activity :

    protected void onCreate(Bundle savedInstanceState) {

mainFragment = MainFragment.newInstance();

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.contentFrame, mainFragment);
transaction.commit();

new MainPresenter(new MainDataRepository(), mainFragment);
}

这是我的 fragment (MainFragment) - 注意: updateList(null) - 这是它清除所有数据的地方,包括存储库内部:

    public MainFragment() {
}

public static MainFragment newInstance() {
return new MainFragment();
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//....

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
recyclerAdapter.updateList(null); // **This is where it clears all data, including inside Repository**

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.loadList(); // to reload the list
}
}, 1500);
}
});

//...
}

@Override
public void onResume() {
super.onResume();

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.loadList();
}
}, 3000);
}

@Override
public void setPresenter(MainContractor.Presenter presenter) {
mPresenter = presenter;
}

@Override
public void showList(List<String> mainDataList) {
if(recyclerAdapter == null) {
recyclerAdapter = new RecyclerAdapter(mainDataList);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(recyclerAdapter);
}else{
recyclerAdapter.updateList(mainDataList);
}
}

这是我的演示者 (MainPresenter):

    public MainPresenter(MainDataRepository mainDataRepository, MainContractor.View view){
mMainDataRepository = mainDataRepository;
mMainContractorView = view;

view.setPresenter(this);
}

@Override
public void loadList() {
ArrayList<String> strings = mMainDataRepository.getList();

mMainContractorView.showList(strings);
}

这是我的存储库 (MainDataRepository):

private ArrayList<String> repositoryList;

public MainDataRepository() {
createList();
}

private void createList() {
if(repositoryList == null){
repositoryList = new ArrayList<>();
}

for (int i = 1; i <= 10; i++) {
repositoryList.add("Item " + i);
}
}

public ArrayList<String> getList(){
return repositoryList;
}

最后一个,这就是我在 RecyclerAdapter 中更新 recyclerview 的方式:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

private List<String> stringsList;

public RecyclerAdapter(List<String> stringsList) {
this.stringsList = stringsList;
}

public void updateList(List<String> newStrings){
if(newStrings != null){
stringsList = newStrings;
}else{
stringsList.clear();
}
notifyDataSetChanged();
}

//....
}

为什么 RecyclerAdapter 中的 updateList 方法也会清除存储库中的数据 ArrayList<String> repositoryList

最佳答案

这是因为你引用了同一个对象。在这里你从存储库返回你的列表,更好的选择是返回它的副本:

public ArrayList<String> getList(){
return new ArrayList<>(repositoryList);
}

然后它将是另一个具有复制项的对象。

关于Android MVP架构——repository和view之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com