/*
* Copyright 2014 Soichiro Kashima
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.shaweibo.biu.ui.common;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.shaweibo.biu.R;
import com.shaweibo.biu.adapter.timeline.BaseTimelinAdapter;
import com.shaweibo.biu.dao.timeline.ITimelineBaseDao;
import com.shaweibo.biu.ui.main.MainActivity;
import com.shaweibo.biu.ui.timeline.StatusDetailActivity;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.github.ksoichiro.android.observablescrollview.ScrollUtils;
import com.nineoldandroids.view.ViewHelper;
import butterknife.ButterKnife;
import butterknife.InjectView;
public abstract class ViewPagerTabRecyclerViewFragment extends FlexibleSpaceBaseFragment<ObservableRecyclerView> implements
MainActivity.MainRefresh {
public static final String ARG_INITIAL_POSITION = "ARG_INITIAL_POSITION";
protected ITimelineBaseDao mDao;
private BaseTimelinAdapter mAdapter;
@InjectView(R.id.scroll)
ObservableRecyclerView recyclerView;
private boolean mRefreshing = false;
int headViewHeight=0;
View mView;
private LinearLayoutManager mManager;
Activity parentActivity;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_recyclerview, container, false);
ButterKnife.inject(this,mView);
parentActivity = getActivity();
mManager=new LinearLayoutManager(parentActivity);
recyclerView.setLayoutManager(mManager);
recyclerView.setHasFixedSize(false);
mDao=bindDao();
mDao.loadFromCache();
// TouchInterceptionViewGroup should be a parent view other than ViewPager.
// This is a workaround for the issue #117:
// https://github.com/ksoichiro/Android-ObservableScrollView/issues/117
recyclerView.setTouchInterceptionViewGroup((ViewGroup) mView.findViewById(R.id.fragment_root));
// Scroll to the specified offset after layout
if (isFirstCreate) {
new Refresher().execute(true);
}
new Handler().post(new Runnable() {
@Override
public void run() {
View headerView = LayoutInflater.from(parentActivity).inflate(R.layout.padding, null);
if (parentActivity instanceof HeaderViewObserve){
headViewHeight =((HeaderViewObserve) parentActivity).getHeadViewHeight();
if(headViewHeight!=0){
headerView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,headViewHeight));
}
}
mAdapter=bindListAdapter(headerView);
recyclerView.setAdapter(mAdapter);
Bundle args = getArguments();
if (args != null && args.containsKey(ARG_SCROLL_Y)) {
final int scrollY = args.getInt(ARG_SCROLL_Y, 0);
ScrollUtils.addOnGlobalLayoutListener(recyclerView, new Runnable() {
@Override
public void run() {
int offset = scrollY % headViewHeight;
RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();
if (lm != null && lm instanceof LinearLayoutManager) {
((LinearLayoutManager) lm).scrollToPositionWithOffset(0, -offset);
}
}
});
updateFlexibleSpace(scrollY, mView);
} else {
updateFlexibleSpace(0, mView);
}
}
});
recyclerView.setScrollViewCallbacks(this);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int lastVisibleItem = mManager.findLastCompletelyVisibleItemPosition();
int totalItemCount = mManager.getItemCount();
if (lastVisibleItem == (totalItemCount - 1)) {
new Refresher().execute(false);
}
}
}
});
return mView;
}
@Override
public void doRefresh() {
recyclerView.scrollToPosition(0);
recyclerView.post(new Runnable() {
@Override
public void run() {
if (!mRefreshing) {
new Refresher().execute(true);
}
}
});
}
protected void load(boolean param) {
mDao.load(param);
mDao.cache();
}
private class Refresher extends AsyncTask<Boolean, Void, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mRefreshing = true;
}
@Override
protected Boolean doInBackground(Boolean... params) {
load(params[0]);
return params[0];
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
// if (result) {
// mList.smoothScrollToPosition(0);
// }
mAdapter.setBottomStatus(mDao.getStatus());
mAdapter.notifyDataSetChanged();
mRefreshing = false;
// if (mSwipeRefresh != null) {
// mSwipeRefresh.setRefreshing(false);
// }
}
}
protected abstract ITimelineBaseDao bindDao();
protected abstract BaseTimelinAdapter bindListAdapter(View headView);
public interface HeaderViewObserve{
public int getHeadViewHeight();
}
@Override
public void setScrollY(int scrollY, int threshold) {
View view = getView();
if (view == null) {
return;
}
ObservableRecyclerView recyclerView = (ObservableRecyclerView) view.findViewById(R.id.scroll);
if (recyclerView == null) {
return;
}
View firstVisibleChild = recyclerView.getChildAt(0);
if (firstVisibleChild != null) {
int offset = scrollY;
int position = 0;
if (threshold < scrollY) {
int baseHeight = firstVisibleChild.getHeight();
position = scrollY / baseHeight;
offset = scrollY % baseHeight;
}
RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();
if (lm != null && lm instanceof LinearLayoutManager) {
((LinearLayoutManager) lm).scrollToPositionWithOffset(position, -offset);
}
}
}
@Override
public void updateFlexibleSpace(int scrollY, View view) {
// int flexibleSpaceImageHeight = getResources().getDimensionPixelSize(R.dimen.flexible_space_image_height);
View recyclerViewBackground = view.findViewById(R.id.list_background);
// Translate list background
ViewHelper.setTranslationY(recyclerViewBackground, Math.max(0, -scrollY + headViewHeight));
// Also pass this event to parent Activity
StatusDetailActivity parentActivity =
(StatusDetailActivity) getActivity();
if (parentActivity != null) {
parentActivity.onScrollChanged(scrollY, (ObservableRecyclerView) view.findViewById(R.id.scroll));
}
}
}