Browse Source

尝试添加可以刷新多个数据BaseListFragment

zengjiebin 7 years ago
parent
commit
317eeff601

+ 109 - 0
app/src/main/java/com/sheep/gamegroup/absBase/ApiRefresh.java

@@ -0,0 +1,109 @@
+package com.sheep.gamegroup.absBase;
+
+import com.sheep.gamegroup.model.api.ApiService;
+import com.sheep.gamegroup.model.entity.BaseMessage;
+import com.sheep.gamegroup.model.util.SheepSubscriber;
+import com.sheep.gamegroup.util.DataUtil;
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.view.fragment.BaseListFragment6;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+
+import java.util.List;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by realicing on 2018/11/28.
+ * realicing@sina.com
+ */
+public abstract class ApiRefresh<T> {
+
+    public abstract String getKey(int page, int per_page);
+
+    public abstract Observable<BaseMessage> getApi(ApiService apiService);
+
+    public abstract Class<T> getTClass();
+
+    protected BaseMessage lastMessage;//最后一个网络获取的结果
+    protected int page = 1;//页数
+    protected int per_page = DataUtil.PER_PAGE;
+    private boolean loadMore;
+    protected List<T> list = ListUtil.emptyList();
+    protected List<T> lastCacheList = ListUtil.emptyList();
+
+    public boolean loadMoreData() {
+        if (!loadMore) {
+            loadMore = true;
+            if (ListUtil.size(list) >= per_page * page) {
+                page += 1;
+                initData();
+            } else {
+                if (baseListFragment6 != null)
+                    baseListFragment6.setNoMore(false);
+            }
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    public void clear() {
+        lastMessage = null;
+        list.clear();
+        page = 1;
+    }
+
+    protected BaseListFragment6<?> baseListFragment6;
+
+    public void initData() {
+        final String urlKey = getKey(page, per_page);
+        final boolean isFirstGetACache = urlKey != null;
+        if (isFirstGetACache) {
+            //先尝试获取缓存数据
+            lastCacheList = DataUtil.getInstance().getCacheList(urlKey, getTClass());
+            loadList(lastCacheList);
+        }
+        getApi(SheepApp.getInstance().getNetComponent().getApiService())
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new SheepSubscriber<BaseMessage>(SheepApp.getInstance()) {
+                    @Override
+                    public void onNext(BaseMessage baseMessage) {
+                        lastMessage = baseMessage;
+                        boolean isNewData = DataUtil.getInstance().isNewData(urlKey);
+                        if (isNewData || !isFirstGetACache) {
+                            if (isFirstGetACache)
+                                ListUtil.removeAll(list, lastCacheList);
+                            List<T> newList = baseMessage.getDatas(getTClass());
+                            loadList(newList);
+                        } else {
+                            notifyDataSetChanged();
+                        }
+                    }
+
+                    @Override
+                    public void onError(BaseMessage baseMessage) {
+                        notifyDataSetChanged();
+                    }
+                });
+    }
+
+    private void notifyDataSetChanged() {
+        if (baseListFragment6 != null)
+            baseListFragment6.notifyDataSetChanged();
+    }
+
+    protected List<T> newList;
+
+    protected void loadList(List<T> addList) {
+        ListUtil.addAllItem(list, addList);
+        newList = addList;
+        notifyDataSetChanged();
+    }
+
+    public void setLoadMore(boolean loadMore) {
+        this.loadMore = loadMore;
+    }
+}

+ 9 - 20
app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment5.java

@@ -56,7 +56,7 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
                 break;
             case REFRESH_ON_YOURSELF:
             default:
-                notifyDataSetChanged(0);
+                notifyDataSetChanged();
                 break;
         }
     }
@@ -76,7 +76,6 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
     protected BaseQuickAdapter<T, BaseViewHolder> baseQuickAdapter;
 
     protected BaseMessage lastMessage;//最后一个网络获取的结果
-    protected BaseMessage lastMessage2;//最后一个网络获取的结果
     protected int page = 1;//页数
     protected int per_page = DataUtil.PER_PAGE;
     private boolean loadMore;
@@ -141,14 +140,10 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
     protected List<T> list = ListUtil.emptyList();
     protected List<T> lastCacheList = ListUtil.emptyList();
 
-    //默认先获取缓存
-    protected boolean isFirstGetACache() {
-        return true;
-    }
-
     public void initData() {
         final String urlKey = getKey(page, per_page);
-        if (isFirstGetACache()) {
+        final boolean isFirstGetACache = urlKey != null;
+        if (isFirstGetACache) {
             //先尝试获取缓存数据
             lastCacheList = DataUtil.getInstance().getCacheList(urlKey, getTClass());
             loadList(lastCacheList);
@@ -169,19 +164,19 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
                     public void onNext(BaseMessage baseMessage) {
                         lastMessage = baseMessage;
                         boolean isNewData = DataUtil.getInstance().isNewData(urlKey);
-                        if (isNewData || !isFirstGetACache()) {
-                            if (isFirstGetACache())
+                        if (isNewData || !isFirstGetACache) {
+                            if (isFirstGetACache)
                                 ListUtil.removeAll(list, lastCacheList);
                             List<T> newList = baseMessage.getDatas(getTClass());
                             loadList(newList);
                         } else {
-                            notifyDataSetChanged(1);
+                            notifyDataSetChanged();
                         }
                     }
 
                     @Override
                     public void onError(BaseMessage baseMessage) {
-                        notifyDataSetChanged(1);
+                        notifyDataSetChanged();
                     }
                 });
     }
@@ -205,7 +200,6 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
 
     public void clear() {
         lastMessage = null;
-        lastMessage2 = null;
         setNoMore(true);
         list.clear();
         page = 1;
@@ -223,14 +217,13 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
     protected void loadList(List<T> addList) {
         ListUtil.addAllItem(list, addList);
         newList = addList;
-        notifyDataSetChanged(1);
+        notifyDataSetChanged();
     }
 
-    public void notifyDataSetChanged(int x) {
+    public void notifyDataSetChanged() {
         if (recyclerView == null)
             recyclerView = findViewById(R.id.recyclerView);
         loadMore = false;
-        updateEmptyView();
         ViewUtil.notifyDataSetChanged(recyclerView);
         finishRefresh();
     }
@@ -241,10 +234,6 @@ public abstract class BaseListFragment5<T> extends BaseFragment implements IRefr
         baseQuickAdapter.loadMoreComplete();
     }
 
-    protected void updateEmptyView() {
-
-    }
-
     @Override
     public void onDestroyView() {
         super.onDestroyView();

+ 3 - 3
app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment5x.java

@@ -120,7 +120,7 @@ public abstract class BaseListFragment5x<I, T, T2> extends BaseFragment implemen
                 page += 1;
                 initData();
             } else {
-                setNoMore(false);
+                setNoMore(true);
             }
         } else {
             finishRefresh();
@@ -135,7 +135,7 @@ public abstract class BaseListFragment5x<I, T, T2> extends BaseFragment implemen
     }
 
     protected boolean isLoadMoreGoneWhenNoMore() {
-        return false;
+        return true;
     }
 
     protected List<T> list = ListUtil.emptyList();
@@ -237,7 +237,7 @@ public abstract class BaseListFragment5x<I, T, T2> extends BaseFragment implemen
     public void clear() {
         lastMessage = null;
         lastMessage2 = null;
-        setNoMore(true);
+        setNoMore(false);
         list.clear();
         list2.clear();
         page = 1;

+ 213 - 0
app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment6.java

@@ -0,0 +1,213 @@
+package com.sheep.gamegroup.view.fragment;
+
+import android.app.Activity;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.sheep.gamegroup.absBase.AbsObserver;
+import com.sheep.gamegroup.absBase.ApiRefresh;
+import com.sheep.gamegroup.absBase.ILoadMore;
+import com.sheep.gamegroup.absBase.IRefresh;
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.SysAppUtil;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.base.BaseFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/11/28.
+ * realicing@sina.com
+ * 可设置每次请求多个接口
+ * android.support.v4.widget.SwipeRefreshLayout与RecyclerView来实现上拉刷新与下拉加载更多,子类提供网络接口相关
+ */
+public abstract class BaseListFragment6<T> extends BaseFragment implements IRefresh, ILoadMore {
+    @Override
+    public int getLayoutId() {
+        return R.layout.common_title_net_srl_rv;
+    }
+
+    protected Activity activity;
+
+    @Override
+    public void onViewCreated() {
+        activity = getActivity();
+        initView();
+        initListener();
+        switch (refreshDataType()) {
+            case REFRESH_ON_CREATE:
+                refreshData();
+                break;
+            case REFRESH_ON_RESUME:
+                break;
+            case REFRESH_ON_YOURSELF:
+            default:
+                notifyDataSetChanged();
+                break;
+        }
+    }
+    private List<ApiRefresh<? extends Object>> apiRefreshList = new ArrayList<>();
+
+    public static final int REFRESH_ON_CREATE = 0;
+    public static final int REFRESH_ON_RESUME = 1;
+    public static final int REFRESH_ON_YOURSELF = -1;
+    @BindView(R.id.title)
+    View title;
+    @BindView(R.id.check_net_ll)
+    View check_net_ll;
+    @BindView(R.id.swipeRefreshLayout)
+    SwipeRefreshLayout swipeRefreshLayout;
+    @BindView(R.id.recyclerView)
+    RecyclerView recyclerView;
+
+    protected BaseQuickAdapter<T, BaseViewHolder> baseQuickAdapter;
+
+
+    public void initView() {
+        ViewUtil.setVisibility(title, false);
+    }
+
+    public void initListener() {
+        if (swipeRefreshLayout != null) {
+            swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+                @Override
+                public void onRefresh() {
+                    refreshData();
+                }
+            });
+        }
+        recyclerView.setLayoutManager(getLayoutManager());
+        baseQuickAdapter = getAdapter();
+        baseQuickAdapter.bindToRecyclerView(recyclerView);
+        initLoadMoreListener();
+    }
+
+    protected void initLoadMoreListener() {
+        baseQuickAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
+            @Override
+            public void onLoadMoreRequested() {
+                loadMoreData();
+            }
+        }, recyclerView);
+    }
+
+    protected RecyclerView.LayoutManager getLayoutManager() {
+        return new LinearLayoutManager(SheepApp.getInstance());
+    }
+
+    public void loadMoreData() {
+        ListUtil.forEach(apiRefreshList, new Action1<ApiRefresh<? extends Object>>() {
+            @Override
+            public void call(ApiRefresh<?> apiRefresh) {
+                if(apiRefresh.loadMoreData()){
+                    finishRefresh();
+                }
+            }
+        });
+    }
+
+    public void setNoMore(boolean noMore) {
+        if (noMore) {
+            baseQuickAdapter.loadMoreEnd(isLoadMoreGoneWhenNoMore());
+        }
+        finishRefresh();
+    }
+
+    protected boolean isLoadMoreGoneWhenNoMore() {
+        return false;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (refreshDataType() == REFRESH_ON_RESUME) {
+            refreshData();
+        }
+    }
+
+    /**
+     * 在哪里初始化数据:0 onViewCreated后, 1 onResume后, -1 不初始化
+     *
+     * @return
+     */
+    public int refreshDataType() {
+        return REFRESH_ON_CREATE;
+    }
+
+    public void refreshData() {
+        checkMetLl();
+        clear();
+        ListUtil.forEach(apiRefreshList, new Action1<ApiRefresh<? extends Object>>() {
+            @Override
+            public void call(ApiRefresh<?> apiRefresh) {
+                apiRefresh.clear();
+            }
+        });
+        ViewUtil.notifyDataSetChanged(recyclerView);
+        ListUtil.forEach(apiRefreshList, new Action1<ApiRefresh<? extends Object>>() {
+            @Override
+            public void call(ApiRefresh<?> apiRefresh) {
+                apiRefresh.initData();
+            }
+        });
+    }
+    protected void clear(){
+        setNoMore(true);
+        initLoadMoreListener();
+    }
+    public void checkMetLl(){
+        if (check_net_ll != null) {
+            SysAppUtil.checkNet(new AbsObserver<Integer>() {
+                @Override
+                public void onNext(Integer result) {
+                    ViewUtil.setVisibility(check_net_ll, result != 0);
+                }
+            });
+        }
+    }
+
+    public void notifyDataSetChanged() {
+        if (recyclerView == null)
+            recyclerView = findViewById(R.id.recyclerView);
+        ListUtil.forEach(apiRefreshList, new Action1<ApiRefresh<? extends Object>>() {
+            @Override
+            public void call(ApiRefresh<?> apiRefresh) {
+                apiRefresh.setLoadMore(false);
+            }
+        });
+        updateEmptyView();
+        ViewUtil.notifyDataSetChanged(recyclerView);
+        finishRefresh();
+    }
+
+    protected void finishRefresh() {
+        if (swipeRefreshLayout != null)
+            swipeRefreshLayout.setRefreshing(false);
+        baseQuickAdapter.loadMoreComplete();
+    }
+
+    protected void updateEmptyView() {
+
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        if (recyclerView != null) {
+            recyclerView = null;
+        }
+    }
+
+    protected abstract BaseQuickAdapter<T, BaseViewHolder> getAdapter();
+
+}