/**
* Copyright 2016 JustWayward Team
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.justwayward.reader.view.recyclerview.adapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.justwayward.reader.view.recyclerview.EasyRecyclerView;
/**
* Created by Mr.Jude on 2015/8/18.
*/
public class DefaultEventDelegate implements EventDelegate {
private RecyclerArrayAdapter adapter;
private EventFooter footer ;
private OnLoadMoreListener onLoadMoreListener;
private boolean hasData = false;
private boolean isLoadingMore = false;
private boolean hasMore = false;
private boolean hasNoMore = false;
private boolean hasError = false;
private int status = STATUS_INITIAL;
private static final int STATUS_INITIAL = 291;
private static final int STATUS_MORE = 260;
private static final int STATUS_NOMORE = 408;
private static final int STATUS_ERROR = 732;
public DefaultEventDelegate(RecyclerArrayAdapter adapter) {
this.adapter = adapter;
footer = new EventFooter();
adapter.addFooter(footer);
}
public void onMoreViewShowed() {
log("onMoreViewShowed");
if (!isLoadingMore&&onLoadMoreListener!=null){
isLoadingMore = true;
onLoadMoreListener.onLoadMore();
}
}
public void onErrorViewShowed() {
resumeLoadMore();
}
//-------------------5个状态触发事件-------------------
@Override
public void addData(int length) {
log("addData" + length);
if (hasMore){
if (length == 0){
//当添加0个时,认为已结束加载到底
if (status==STATUS_INITIAL || status == STATUS_MORE){
footer.showNoMore();
}
}else {
//当Error或初始时。添加数据,如果有More则还原。
if (hasMore && (status == STATUS_INITIAL || status == STATUS_ERROR)){
footer.showMore();
}
hasData = true;
}
}else{
if (hasNoMore){
footer.showNoMore();
status = STATUS_NOMORE;
}
}
isLoadingMore = false;
}
@Override
public void clear() {
log("clear");
hasData = false;
status = STATUS_INITIAL;
footer.hide();
isLoadingMore = false;
}
@Override
public void stopLoadMore() {
log("stopLoadMore");
footer.showNoMore();
status = STATUS_NOMORE;
isLoadingMore = false;
}
@Override
public void pauseLoadMore() {
log("pauseLoadMore");
footer.showError();
status = STATUS_ERROR;
isLoadingMore = false;
}
@Override
public void resumeLoadMore() {
isLoadingMore = false;
footer.showMore();
onMoreViewShowed();
}
//-------------------3种View设置-------------------
@Override
public void setMore(View view, OnLoadMoreListener listener) {
this.footer.setMoreView(view);
this.onLoadMoreListener = listener;
hasMore = true;
log("setMore");
}
@Override
public void setNoMore(View view) {
this.footer.setNoMoreView(view);
hasNoMore = true;
log("setNoMore");
}
@Override
public void setErrorMore(View view) {
this.footer.setErrorView(view);
hasError = true;
log("setErrorMore");
}
private class EventFooter implements RecyclerArrayAdapter.ItemView {
private FrameLayout container;
private View moreView;
private View noMoreView;
private View errorView;
private int flag = Hide;
public static final int Hide = 0;
public static final int ShowMore = 1;
public static final int ShowError = 2;
public static final int ShowNoMore = 3;
public EventFooter(){
container = new FrameLayout(adapter.getContext());
container.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
@Override
public View onCreateView(ViewGroup parent) {
log("onCreateView");
return container;
}
@Override
public void onBindView(View headerView) {
log("onBindView");
switch (flag){
case ShowMore:
onMoreViewShowed();
break;
case ShowError:
onErrorViewShowed();
break;
}
}
public void refreshStatus(){
if (container!=null){
if (flag == Hide){
container.setVisibility(View.GONE);
return;
}
if (container.getVisibility() != View.VISIBLE)container.setVisibility(View.VISIBLE);
View view = null;
switch (flag){
case ShowMore:view = moreView;break;
case ShowError:view = errorView;break;
case ShowNoMore:view = noMoreView;break;
}
if (view == null){
hide();
return;
}
if (view.getParent()==null)container.addView(view);
for (int i = 0; i < container.getChildCount(); i++) {
if (container.getChildAt(i) == view)view.setVisibility(View.VISIBLE);
else container.getChildAt(i).setVisibility(View.GONE);
}
}
}
public void showError(){
flag = ShowError;
refreshStatus();
}
public void showMore(){
flag = ShowMore;
refreshStatus();
}
public void showNoMore(){
flag = ShowNoMore;
refreshStatus();
}
//初始化
public void hide(){
flag = Hide;
refreshStatus();
}
public void setMoreView(View moreView) {
this.moreView = moreView;
}
public void setNoMoreView(View noMoreView) {
this.noMoreView = noMoreView;
}
public void setErrorView(View errorView) {
this.errorView = errorView;
}
}
private static void log(String content){
if (EasyRecyclerView.DEBUG){
Log.i(EasyRecyclerView.TAG,content);
}
}
}