hereのAndroid MVPアーキテクチャを学習しています。私の例では、機能をリフレッシュするために、recyclerview
のリストを表示する自分のシンプルなアプリケーションを作成しました。Android MVPアーキテクチャ - リポジトリとビュー間の通信
リストをプルすると、最初にrecyclerviewをクリアしてから、偽の遅延があるリポジトリから再びデータをリロードします。しかし、RecyclerViewAdpater内のデータをクリアすると、リポジトリ内のすべてのデータもクリアされ、何も表示されません。私は理由を理解できません。ここで
はプレゼンターとビュー(つまり断片である)の両方を作成し、私の活動です:
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);
}
は、ここに私の断片(MainFragment)だ - 注意: updateList(ヌル) - それは、すべてのデータを消去します場所です、リポジトリ内を含む:
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;
}
そして最後の1、これはどのように私は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 mehodはまた、リポジトリ内のデータを消去しますつまり、ArrayList<String> repositoryList
?
このサンプルプロジェクトはhttp://github.com/mmirhoseini/marvelでご覧になれます。この記事はhttps://hackernoon.com/yet-another-mvp-article-part-1-lets-get-プロジェクトを知るためにd3fd553b3e21を使用して、MVPをよりよく理解してください。 –