/*
* Copyright (C) 2017 Drakeet <drakeet.me@gmail.com>
*
* This file is part of rebase-android
*
* rebase-android is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* rebase-android is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rebase-android. If not, see <http://www.gnu.org/licenses/>.
*/
package com.drakeet.rebase.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.drakeet.rebase.R;
import com.drakeet.rebase.tool.LoadMoreDelegate;
import com.drakeet.rebase.tool.SwipeRefreshDelegate;
import java.util.concurrent.atomic.AtomicInteger;
import me.drakeet.multitype.Items;
import me.drakeet.multitype.MultiTypeAdapter;
/**
* @author drakeet
*/
public abstract class ListBaseFragment extends BaseFragment
implements SwipeRefreshDelegate.OnSwipeRefreshListener, LoadMoreDelegate.LoadMoreSubject {
private static final String TAG = ListBaseFragment.class.getSimpleName();
@BindView(android.R.id.list) RecyclerView recyclerView;
private SwipeRefreshDelegate refreshDelegate;
private LoadMoreDelegate loadMoreDelegate;
private AtomicInteger loadingCount;
private boolean isEnd;
protected MultiTypeAdapter adapter;
protected Items items;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
items = new Items();
adapter = new MultiTypeAdapter(items);
refreshDelegate = new SwipeRefreshDelegate(this);
loadMoreDelegate = new LoadMoreDelegate(this);
loadingCount = new AtomicInteger(0);
}
@Nullable @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_list, container, false);
ButterKnife.bind(this, root);
recyclerView.setAdapter(adapter);
loadMoreDelegate.attach(recyclerView);
refreshDelegate.attach(root);
loadData(true);
return root;
}
protected abstract void loadData(boolean clear);
protected boolean onInterceptLoadMore() {
return false;
}
protected void setRefresh(boolean refresh) {
refreshDelegate.setRefresh(refresh);
}
@Override public void onSwipeRefresh() {
loadData(true);
}
@Override public final void onLoadMore() {
if (!isEnd()) {
Log.d(TAG, "[onLoadMore]" + "isEnd == false");
if (!onInterceptLoadMore()) {
loadData(false);
}
}
}
protected boolean isShowingRefresh() {
return refreshDelegate.isShowingRefresh();
}
public void setEnd(boolean end) {
isEnd = end;
}
public boolean isEnd() {
return isEnd;
}
protected void setSwipeToRefreshEnabled(boolean enable) {
refreshDelegate.setEnabled(enable);
}
public void smoothScrollToPosition(int position) {
recyclerView.smoothScrollToPosition(position);
}
@Override public boolean isLoading() {
return loadingCount.get() > 0;
}
protected void notifyLoadingStarted() {
loadingCount.getAndIncrement();
}
protected void notifyLoadingFinished() {
loadingCount.decrementAndGet();
}
}