From fa464a9f1d44d47e0c71efc3f4d06cd4eeb0dfb7 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Tue, 20 Mar 2018 17:33:06 +0800 Subject: [PATCH] =?UTF-8?q?baseList=E5=A4=9A=E6=8E=A5=E5=8F=A3-=E8=B5=84?= =?UTF-8?q?=E8=AE=AF=E9=A1=B5=E9=9D=A2=EF=BC=88=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/AskSelectGameAdapter.java | 2 +- .../ask/AskQuestionsHotFragment.java | 6 +- .../ask/AskQuestionsNewBodyFragment.java | 2 - .../ask/AskQuestionsNewFragment.java | 2 +- .../gh/gamecenter/ask/SelectGameFragment.java | 2 - .../ask/myask/ConcernQuestionsFragment.java | 2 - .../ask/myask/MyAnswerFragment.java | 4 +- .../gamecenter/ask/myask/MyDraftFragment.java | 2 - .../ask/myask/MyQuestionsFragment.java | 2 - .../questionsdetail/AnswerFoldFragment.java | 2 - .../QuestionsDetailAdapter.java | 11 ++- .../QuestionsDetailFragment.java | 3 +- .../ask/search/AskSearchAdapter.java | 2 +- .../ask/search/AskSearchFragment.java | 10 +-- .../gh/gamecenter/baselist/ListAdapter.java | 74 ++++++++++++++++--- .../gh/gamecenter/baselist/ListFragment.java | 28 +++---- .../gamecenter/baselist/ListRepository.java | 36 +++++---- .../gh/gamecenter/baselist/ListViewModel.java | 44 ++--------- .../gh/gamecenter/baselist/LoadStatus.java | 10 +-- .../baselist/NormalListViewModel.java | 29 ++++++++ .../gamecenter/collection/AnswerFragment.java | 2 - .../com/gh/gamecenter/info/InFoViewModel.java | 27 ++----- .../com/gh/gamecenter/info/InfoAdapter.java | 3 +- .../com/gh/gamecenter/info/InfoFragment.java | 6 ++ .../gamecenter/message/MessageFragment.java | 2 - 25 files changed, 165 insertions(+), 148 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/baselist/NormalListViewModel.java diff --git a/app/src/main/java/com/gh/gamecenter/adapter/AskSelectGameAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/AskSelectGameAdapter.java index 596668d548..46255ef29c 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/AskSelectGameAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/AskSelectGameAdapter.java @@ -43,7 +43,7 @@ public class AskSelectGameAdapter extends ListAdapter { } @Override - protected void provideListData(List listData) { + protected void setListData(List listData) { mEntityList.addAll(listData); for (int i = 0; i < mEntityList.size(); i++) { AskGameSelectEntity entity = mEntityList.get(i); diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java index f509b0a9da..775919812b 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java @@ -16,9 +16,8 @@ import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.ListViewModel; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; +import com.gh.gamecenter.baselist.NormalListViewModel; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -34,7 +33,7 @@ import static com.gh.gamecenter.ask.AskFragment.COMMUNITIES_SELECT_REQUEST; * Created by khy on 2/12/17. */ -public class AskQuestionsHotFragment extends ListFragment { +public class AskQuestionsHotFragment extends ListFragment { @BindView(R.id.reuse_nodata_skip_tv_btn) View mSkipHint; @@ -88,7 +87,6 @@ public class AskQuestionsHotFragment extends ListFragment tagGroups) { mTagGroupsList = tagGroups; if (tagGroups != null && tagGroups.size() > 0) { - initTab(); +// initTab(); mViewpager.setVisibility(View.VISIBLE); mAppBar.setVisibility(View.VISIBLE); mNoConn.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java index e3240ac2e5..f1385df25a 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java @@ -24,7 +24,6 @@ import com.gh.gamecenter.ask.entity.CommunitiesGameEntity; import com.gh.gamecenter.ask.entity.MeEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.db.info.InstallInfo; import com.gh.gamecenter.entity.InstallGameEntity; @@ -139,7 +138,6 @@ public class SelectGameFragment extends ListFragment { break; case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } else if (mAdapter.isOver()) { CheckLoginUtils.checkLogin(getContext(), this::showSelectDialog); diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java index 51e359da0b..8b301e3f2b 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java @@ -10,7 +10,6 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -50,7 +49,6 @@ public class ConcernQuestionsFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java index e789fde8e4..219612e086 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java @@ -5,15 +5,14 @@ import android.view.View; import com.gh.common.util.AskLogUtils; import com.gh.common.util.EntranceUtils; -import com.gh.gamecenter.QuestionsDetailActivity; import com.gh.gamecenter.NormalActivity; +import com.gh.gamecenter.QuestionsDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.AnswerDetailFragment; import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -55,7 +54,6 @@ public class MyAnswerFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java index 5aa5426278..4e9eefb1a6 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java @@ -15,7 +15,6 @@ import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.ask.questionsdetail.AnswerEditFragment; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -74,7 +73,6 @@ public class MyDraftFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java index 2977e0d057..8a7bf9f1b2 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java @@ -10,7 +10,6 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -50,7 +49,6 @@ public class MyQuestionsFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java index 6512659a3c..7305a03d80 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java @@ -15,7 +15,6 @@ import com.gh.gamecenter.ask.AnswerDetailFragment; import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -84,7 +83,6 @@ public class AnswerFoldFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java index 40417bdae0..635f056f30 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java @@ -60,7 +60,7 @@ public class QuestionsDetailAdapter extends ListAdapter { } @Override - protected void provideListData(List listData) { + protected void setListData(List listData) { if (listData != null && listData.size() != 0 && mQuestionsDetailEntity != null) { mEntityList.addAll(listData); notifyItemRangeInserted(mEntityList.size() - listData.size() + TOP_ITEM_COUNT, listData.size()); @@ -70,19 +70,18 @@ public class QuestionsDetailAdapter extends ListAdapter { @Override public void loadChange(LoadStatus status) { switch (status) { - case OVER: + case LIST_OVER: mIsOver = true; break; - case ERROR: + case LIST_FAILED: mIsNetworkError = true; break; - case RETRY: + case LIST_LOADED: mIsNetworkError = false; break; - case NORMAL: + case LIST_LOADING: mIsNetworkError = false; mIsOver = false; - return; case REFRESH: mEntityList.clear(); break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java index 4b37056641..76579d66d0 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java @@ -136,7 +136,7 @@ public class QuestionsDetailFragment extends ListFragment { @Override public void onLoadEmpty() { onLoadDone(); - mAdapter.loadChange(LoadStatus.OVER); + mAdapter.loadChange(LoadStatus.LIST_OVER); } @OnClick({R.id.questionsdetail_answer, R.id.questionsdetail_invite}) @@ -176,7 +176,6 @@ public class QuestionsDetailFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } else if (mAdapter.isOver()) { if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java index c47305dc83..2cc8f807d5 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java @@ -35,7 +35,7 @@ public class AskSearchAdapter extends ListAdapter { } @Override - protected void provideListData(List listData) { + protected void setListData(List listData) { if (listData == null) { mEntityList.clear(); } else { diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java index f8c46906e2..bf98b279c8 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java @@ -12,8 +12,8 @@ import com.gh.common.util.AskLogUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.view.VerticalItemDecoration; -import com.gh.gamecenter.QuestionsDetailActivity; import com.gh.gamecenter.NormalActivity; +import com.gh.gamecenter.QuestionsDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.AnswerDetailFragment; import com.gh.gamecenter.ask.QuestionsEditFragment; @@ -21,7 +21,6 @@ import com.gh.gamecenter.ask.entity.AskSearchEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -119,7 +118,7 @@ public class AskSearchFragment extends ListFragment { mReuseNoData.setVisibility(View.GONE); mListLoading.setVisibility(View.GONE); mListRefresh.setRefreshing(false); - mAdapter.provideListData(null); // 刷新页面 + mAdapter.setListData(null); // 刷新页面 } @Override @@ -128,7 +127,7 @@ public class AskSearchFragment extends ListFragment { mReuseNoData.setVisibility(View.VISIBLE); mListLoading.setVisibility(View.GONE); mListRefresh.setRefreshing(false); - mAdapter.provideListData(null); // 刷新页面 + mAdapter.setListData(null); // 刷新页面 } @Override @@ -137,7 +136,6 @@ public class AskSearchFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; @@ -179,7 +177,7 @@ public class AskSearchFragment extends ListFragment { mReuseNoConn.setVisibility(View.GONE); mReuseNoData.setVisibility(View.GONE); mListLoading.setVisibility(View.GONE); - mAdapter.provideListData(null); + mAdapter.setListData(null); return; } postLog(true); diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java index 1cce04e6be..9ad8cff923 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java @@ -1,6 +1,9 @@ package com.gh.gamecenter.baselist; +import android.annotation.SuppressLint; import android.content.Context; +import android.os.AsyncTask; +import android.support.v7.util.DiffUtil; import com.lightgame.adapter.BaseRecyclerAdapter; @@ -16,7 +19,7 @@ public abstract class ListAdapter extends BaseRecyclerAdapter { public static final int FOOTER_ITEM_COUNT = 1; public static final int TOP_ITEM_COUNT = 1; - protected final List mEntityList = new ArrayList<>(); + protected List mEntityList; protected boolean mIsOver; @@ -26,11 +29,64 @@ public abstract class ListAdapter extends BaseRecyclerAdapter { super(context); } - protected void provideListData(List listData) { - if (listData != null && listData.size() != 0) { - mEntityList.addAll(listData); - notifyItemRangeInserted(mEntityList.size() - listData.size(), listData.size()); + @SuppressLint("StaticFieldLeak") + protected void setListData(List updateData) { + if (updateData == null) { + mEntityList = new ArrayList<>(); + notifyDataSetChanged(); + return; } + // 避免手动刷新列表时出现异常动画 + if (mEntityList != null && mEntityList.size() > updateData.size()) { + mEntityList = new ArrayList<>(updateData); + notifyDataSetChanged(); + return; + } + + new AsyncTask() { + @Override + protected DiffUtil.DiffResult doInBackground(Void... voids) { + return DiffUtil.calculateDiff(new DiffUtil.Callback() { + @Override + public int getOldListSize() { + return mEntityList == null ? 0 : mEntityList.size(); + } + + @Override + public int getNewListSize() { + return updateData.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + DataType oldItem = mEntityList.get(oldItemPosition); + DataType newItem = updateData.get(newItemPosition); + return ListAdapter.this.areItemsTheSame(oldItem, newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + DataType oldItem = mEntityList.get(oldItemPosition); + DataType newItem = updateData.get(newItemPosition); + return ListAdapter.this.areContentsTheSame(oldItem, newItem); + } + }); + } + + @Override + protected void onPostExecute(DiffUtil.DiffResult diffResult) { + mEntityList = new ArrayList<>(updateData); + diffResult.dispatchUpdatesTo(ListAdapter.this); + } + }.execute(); + } + + protected boolean areItemsTheSame(DataType oldItem, DataType newItem) { + return true; + } + + protected boolean areContentsTheSame(DataType oldItem, DataType newItem) { + return true; } public boolean isNetworkError() { @@ -39,16 +95,16 @@ public abstract class ListAdapter extends BaseRecyclerAdapter { public void loadChange(LoadStatus status) { switch (status) { - case OVER: + case LIST_OVER: mIsOver = true; break; - case ERROR: + case LIST_FAILED: mIsNetworkError = true; break; - case RETRY: + case LIST_LOADED: mIsNetworkError = false; break; - case NORMAL: + case LIST_LOADING: mIsNetworkError = false; mIsOver = false; return; diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListFragment.java b/app/src/main/java/com/gh/gamecenter/baselist/ListFragment.java index 1d3340fbd8..0132a3ac24 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListFragment.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListFragment.java @@ -15,7 +15,6 @@ import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.normal.NormalFragment; -import com.halo.assistant.HaloApp; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -44,10 +43,10 @@ public abstract class ListFragment viewModelClass = getViewModelClass(); - final VM.Factory factory = new VM.Factory(HaloApp.getInstance().getApplication(), this); - mListViewModel = ViewModelProviders.of(this, factory).get(viewModelClass); + mListViewModel = ViewModelProviders.of(this).get(viewModelClass); mListViewModel.getObsListData().observe(this, this); mListViewModel.getLoadStatusLiveData().observe(this, o -> { if (o instanceof LoadStatus) { @@ -88,13 +86,10 @@ public abstract class ListFragment ts) { assert ts != null; - provideListAdapter().provideListData(ts); + provideListAdapter().setListData(ts); } @Override @@ -149,14 +144,11 @@ public abstract class ListFragment { - provideListAdapter().loadChange(LoadStatus.REFRESH); - mReuseNoConn.setVisibility(View.GONE); - mReuseNoData.setVisibility(View.GONE); - mListLoading.setVisibility(View.VISIBLE); - mListRv.setVisibility(View.GONE); - mListRefresh.setRefreshing(false); - mListViewModel.load(LoadType.REFRESH); }, 500); } diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java b/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java index d497e0d864..2c06057288 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java @@ -2,9 +2,11 @@ package com.gh.gamecenter.baselist; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.MutableLiveData; +import android.support.annotation.MainThread; import com.gh.gamecenter.retrofit.Response; +import java.util.ArrayList; import java.util.List; import retrofit2.HttpException; @@ -16,11 +18,11 @@ import rx.schedulers.Schedulers; * Created by khy on 2/12/17. */ -public class ListRepository { +public class ListRepository { private final static int REQUEST_FAILURE_SIZE = -100; - private MutableLiveData> mResultLiveData = new MutableLiveData<>(); + private MutableLiveData> mResultLiveData = new MutableLiveData<>(); private MutableLiveData mLoadStatusLiveData = new MutableLiveData<>(); private OnDataObservable mDataObservable; @@ -38,12 +40,13 @@ public class ListRepository { if (mCurLoadParams == null) initLoadParams(); LoadParams loadParams = mRetryParams != null ? mRetryParams : mCurLoadParams; - Observable> listObservable = mDataObservable.provideDataObservable(loadParams.getLoadOffset()); + Observable> listObservable = mDataObservable.provideDataObservable(loadParams.getLoadOffset()); LoadStatus curStatus = mLoadStatusLiveData.getValue(); - if (listObservable == null || curStatus != null && curStatus != LoadStatus.INIT_LOADED && curStatus != LoadStatus.LIST_LOADED) { - return; - } + if (listObservable == null || curStatus != null && + curStatus != LoadStatus.INIT_LOADED && + curStatus != LoadStatus.LIST_LOADED && + curStatus != LoadStatus.INIT) return; if (mCurLoadParams.getLoadOffset() == 0) { mLoadStatusLiveData.postValue(LoadStatus.INIT_LOADING); @@ -54,16 +57,17 @@ public class ListRepository { listObservable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { + .subscribe(new Response>() { @Override - public void onResponse(List response) { + public void onResponse(List response) { loadStatusControl(response.size()); - // todo post整个列表还是当前列表 -// List previousData = mResultLiveData.getValue(); -// if (previousData == null) previousData = new ArrayList<>(); -// previousData.addAll(response); - mResultLiveData.postValue(response); + List previousData = mResultLiveData.getValue(); + if (previousData == null || curStatus == LoadStatus.INIT) { + previousData = new ArrayList<>(); + } + previousData.addAll(response); + mResultLiveData.postValue(previousData); } @Override @@ -104,16 +108,20 @@ public class ListRepository { private void initLoadParams() { mCurLoadParams = new LoadParams(0); + mLoadStatusLiveData.setValue(LoadStatus.INIT); } + @MainThread protected void load(LoadType loadType) { if (loadType == LoadType.REFRESH) { initLoadParams(); + } else if (loadType == LoadType.RETRY) { + mLoadStatusLiveData.setValue(LoadStatus.INIT); } loadData(); } - public LiveData> getResultLiveData() { + public LiveData> getResultLiveData() { return mResultLiveData; } diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java b/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java index 415c33d81e..7d735dad35 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java @@ -3,38 +3,31 @@ package com.gh.gamecenter.baselist; import android.app.Application; import android.arch.lifecycle.AndroidViewModel; import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.ViewModel; -import android.arch.lifecycle.ViewModelProvider; +import android.arch.lifecycle.MediatorLiveData; import android.support.annotation.NonNull; import java.util.List; -import rx.Observable; - /** * Created by khy on 2/12/17. */ -public class ListViewModel extends AndroidViewModel implements OnDataObservable { +public abstract class ListViewModel extends AndroidViewModel implements OnDataObservable { private ListRepository mRepository; - protected LiveData> mListLiveData; + protected final MediatorLiveData> mResultLiveData = new MediatorLiveData<>(); - - public ListViewModel(Application application, ListRepository repository) { - super(application); - mRepository = repository; - mListLiveData = mRepository.getResultLiveData(); - } + protected final LiveData> mListLiveData; public ListViewModel(@NonNull Application application) { super(application); mRepository = new ListRepository(this); + mListLiveData = mRepository.getResultLiveData(); } - public LiveData> getObsListData() { - return mListLiveData; + public LiveData> getObsListData() { + return mResultLiveData; } public LiveData getLoadStatusLiveData() { @@ -45,27 +38,4 @@ public class ListViewModel extends AndroidViewModel implements OnDataObservab mRepository.load(loadType); } - @Override - public Observable> provideDataObservable(int offset) { - return null; - } - - public static class Factory extends ViewModelProvider.NewInstanceFactory { - @NonNull - private final Application mApplication; - - private final ListRepository mRepository; - - public Factory(@NonNull Application application, OnDataObservable onDataObservable) { - mApplication = application; - mRepository = new ListRepository(onDataObservable); - } - - @Override - public T create(Class modelClass) { - //noinspection unchecked - return (T) new ListViewModel(mApplication, mRepository); - } - } - } diff --git a/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java b/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java index aab8614d63..c5fc43e2ab 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java @@ -7,18 +7,10 @@ package com.gh.gamecenter.baselist; public enum LoadStatus { // todo 删除 - ERROR, - - OVER, - REFRESH, - RETRY, - - NORMAL, - - //初始化加载状态 + INIT, INIT_LOADING, INIT_LOADED, INIT_FAILED, diff --git a/app/src/main/java/com/gh/gamecenter/baselist/NormalListViewModel.java b/app/src/main/java/com/gh/gamecenter/baselist/NormalListViewModel.java new file mode 100644 index 0000000000..b72f877ffe --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/baselist/NormalListViewModel.java @@ -0,0 +1,29 @@ +package com.gh.gamecenter.baselist; + +import android.app.Application; +import android.support.annotation.NonNull; + +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 20/03/18. + */ + +public class NormalListViewModel extends ListViewModel { + + public NormalListViewModel(@NonNull Application application) { + super(application); + mResultLiveData.addSource(mListLiveData, mResultLiveData::postValue); + } + + @Override + public Observable> provideDataObservable(int offset) { + return RetrofitManager.getInstance(getApplication()).getApi().getAskHot(UserManager.getInstance().getCommunityId(getApplication()), offset); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java index 49dfbeae4b..98c73ad327 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java @@ -13,7 +13,6 @@ import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -46,7 +45,6 @@ public class AnswerFragment extends ListFragment { switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } break; diff --git a/app/src/main/java/com/gh/gamecenter/info/InFoViewModel.java b/app/src/main/java/com/gh/gamecenter/info/InFoViewModel.java index fd3ba66112..3ffd686e9a 100644 --- a/app/src/main/java/com/gh/gamecenter/info/InFoViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/info/InFoViewModel.java @@ -2,10 +2,7 @@ package com.gh.gamecenter.info; import android.app.Application; import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.MediatorLiveData; -import android.arch.lifecycle.Observer; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import com.gh.gamecenter.baselist.ListViewModel; import com.gh.gamecenter.entity.NewsEntity; @@ -20,15 +17,13 @@ import rx.Observable; * Created by khy on 19/03/18. */ -public class InFoViewModel extends ListViewModel { - - MediatorLiveData> mNewsListLiveData = new MediatorLiveData<>(); +public class InFoViewModel extends ListViewModel { NewsViewsRepository mNewsViewsRepository = new NewsViewsRepository<>(); public InFoViewModel(@NonNull Application application) { super(application); - mNewsListLiveData.addSource(mListLiveData, (Observer>) list -> { + mResultLiveData.addSource(mListLiveData, list -> { if (list == null) return; StringBuilder builder = new StringBuilder(); for (int i = 0, size = list.size(); i < size; i++) { @@ -42,12 +37,10 @@ public class InFoViewModel extends ListViewModel { }); LiveData> listLiveData = mNewsViewsRepository.asLiveData(); - - mNewsListLiveData.addSource(listLiveData, new Observer>() { - @Override - public void onChanged(@Nullable List viewsEntities) { - // todo 此处有问题 - List value = mNewsListLiveData.getValue(); + mResultLiveData.addSource(listLiveData, viewsEntities -> { + // todo 此处有问题 + List value = mListLiveData.getValue(); + if (value != null && viewsEntities != null) for (ViewsEntity viewsEntity : viewsEntities) { for (NewsEntity newsEntity : value) { if (viewsEntity.getId().equals(newsEntity.getId())) { @@ -56,16 +49,10 @@ public class InFoViewModel extends ListViewModel { } } } - mNewsListLiveData.postValue(value); - } + mResultLiveData.postValue(value); }); } - @Override - public LiveData> getObsListData() { - return mNewsListLiveData; - } - @Override public Observable> provideDataObservable(int offset) { return RetrofitManager.getInstance(getApplication()).getApi().getZiXun(offset); diff --git a/app/src/main/java/com/gh/gamecenter/info/InfoAdapter.java b/app/src/main/java/com/gh/gamecenter/info/InfoAdapter.java index 3591dc7253..4e5ef5f32a 100644 --- a/app/src/main/java/com/gh/gamecenter/info/InfoAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/info/InfoAdapter.java @@ -59,7 +59,8 @@ class InfoAdapter extends ListAdapter { view = mLayoutInflater.inflate(R.layout.news_image3_item, parent, false); return new NewsImage3ViewHolder(view, mEntityList, mListListener); case ItemViewType.LOADING: - return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)); + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, null, mListListener); default: return null; } diff --git a/app/src/main/java/com/gh/gamecenter/info/InfoFragment.java b/app/src/main/java/com/gh/gamecenter/info/InfoFragment.java index 1547c4e5e2..d1f42bed63 100644 --- a/app/src/main/java/com/gh/gamecenter/info/InfoFragment.java +++ b/app/src/main/java/com/gh/gamecenter/info/InfoFragment.java @@ -6,8 +6,10 @@ import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.StringUtils; import com.gh.gamecenter.DataUtils; import com.gh.gamecenter.NewsDetailActivity; +import com.gh.gamecenter.R; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.entity.NewsEntity; import java.util.HashMap; @@ -29,6 +31,10 @@ public class InfoFragment extends ListFragment, InFoViewModel> @Override public void onListClick(View view, int position, Object data) { + if (view.getId() == R.id.footerview_item) { + if (mAdapter.isNetworkError()) mListViewModel.load(LoadType.RETRY); + return; + } List newsList = (List) data; NewsEntity newsEntity = newsList.get(position); Map kv = new HashMap<>(); diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java b/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java index fe8f59c911..941acbbc48 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java @@ -17,7 +17,6 @@ import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.ListViewModel; -import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.entity.MessageEntity; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -59,7 +58,6 @@ public class MessageFragment extends ListFragment { public void onListClick(View view, int position, Object data) { if (view.getId() == R.id.footerview_item) { if (mAdapter.isNetworkError()) { - mAdapter.loadChange(LoadStatus.RETRY); mListViewModel.load(LoadType.RETRY); } } else {