package io.hefuyi.zhihudaily.ui.fragment;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import io.hefuyi.zhihudaily.R;
import io.hefuyi.zhihudaily.injector.component.ApplicationComponent;
import io.hefuyi.zhihudaily.injector.component.DaggerThemeStoryComponent;
import io.hefuyi.zhihudaily.injector.component.ThemeStoryComponent;
import io.hefuyi.zhihudaily.injector.module.ActivityModule;
import io.hefuyi.zhihudaily.injector.module.ThemeStoryModule;
import io.hefuyi.zhihudaily.mvp.contract.ThemeStoryContract;
import io.hefuyi.zhihudaily.mvp.model.Theme;
import io.hefuyi.zhihudaily.ui.activity.NavigationDrawerActivity;
import io.hefuyi.zhihudaily.ui.adapter.ThemeStoriesAdapter;
import io.hefuyi.zhihudaily.util.L;
import io.hefuyi.zhihudaily.widget.AvatarsView;
import io.hefuyi.zhihudaily.widget.LoadMoreRecyclerView;
/**
* A simple {@link Fragment} subclass.
*/
public class ThemeStoriesFragment extends BaseFragment implements ThemeStoryContract.View{
public static final String TAG = ThemeStoriesFragment.class.getSimpleName();
@Inject
ThemeStoryContract.Presenter themeStoryPresenter;
@Bind(R.id.swipeRefreshLayout)
SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.recyclerView)
LoadMoreRecyclerView recyclerView;
private ThemeStoriesAdapter mAdapter;
private LinearLayoutManager mLinearLayoutManager;
private String mThemeId;
private String mLastStoryId;
private boolean isDataLoaded;
/*初始化相关*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
L.i(TAG, "onCreate " + this);
super.onCreate(savedInstanceState);
injectDependences();
themeStoryPresenter.attachView(this);
mAdapter = new ThemeStoriesAdapter();
}
private void injectDependences() {
ApplicationComponent applicationComponent = ((NavigationDrawerActivity) getActivity()).getApplicationComponent();
ThemeStoryComponent themeStoryComponent = DaggerThemeStoryComponent.builder()
.applicationComponent(applicationComponent)
.activityModule(new ActivityModule(getActivity()))
.themeStoryModule(new ThemeStoryModule())
.build();
themeStoryComponent.inject(this);
}
/*初始化相关*/
/*view接口*/
@Override
public void showError(final String errorString) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), errorString, Toast.LENGTH_SHORT).show();
}
};
getActivity().runOnUiThread(runnable);
}
@Override
public void showRefreshing() {
Runnable runnable = new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
}
};
getActivity().runOnUiThread(runnable);
}
@Override
public void hideRefreshing() {
Runnable runnable = new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
};
getActivity().runOnUiThread(runnable);
}
@Override
public void showStory(final Theme theme) {
Runnable runnable = new Runnable() {
@Override
public void run() {
if (theme == null) {
isDataLoaded = false;
} else {
isDataLoaded = true;
if (theme.getStories().size() > 0) {
mLastStoryId = theme.getStories().get(theme.getStories().size() - 1).getId();
}
L.i(TAG, "last story id: " + mLastStoryId);
mAdapter.setTheme(theme);
}
}
};
getActivity().runOnUiThread(runnable);
}
@Override
public void appendStory(final Theme theme) {
Runnable runnable = new Runnable() {
@Override
public void run() {
if (theme.getStories().size() > 0) {
mLastStoryId = theme.getStories().get(theme.getStories().size() - 1).getId();
mAdapter.appendStories(theme.getStories());
}
}
};
getActivity().runOnUiThread(runnable);
}
/*view接口*/
/*普通逻辑*/
@Override
public void refreshUI() {
TypedValue itemStoryTextColor = new TypedValue();
TypedValue itemStoryBackground = new TypedValue();
TypedValue windowBackground = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(R.attr.item_story_text_color, itemStoryTextColor, true);
theme.resolveAttribute(R.attr.item_story_background_color, itemStoryBackground, true);
theme.resolveAttribute(R.attr.windowBackground, windowBackground, true);
Resources resources = getResources();
View window=((ViewGroup) getActivity().getWindow().getDecorView());
window.setBackgroundColor(resources.getColor(windowBackground.resourceId));
int childCount = recyclerView.getChildCount();
int firstVisible = mLinearLayoutManager.findFirstVisibleItemPosition();
for (int childIndex = 0; childIndex < childCount; childIndex++) {
int viewType = mAdapter.getItemViewType(childIndex + firstVisible);
switch (viewType) {
case ThemeStoriesAdapter.Type.TYPE_HEADER:
break;
case ThemeStoriesAdapter.Type.TYPE_AVATARS:
AvatarsView avatarsView = (AvatarsView) recyclerView.getChildAt(childIndex);
avatarsView.setBackgroundColor(resources.getColor(windowBackground.resourceId));
break;
case ThemeStoriesAdapter.Type.TYPE_ITEM:
CardView cardView = (CardView) recyclerView.getChildAt(childIndex);
cardView.setCardBackgroundColor(resources.getColor(itemStoryBackground.resourceId));
TextView title = (TextView) cardView.findViewById(R.id.title);
title.setTextColor(resources.getColor(itemStoryTextColor.resourceId));
break;
}
}
invalidateCacheItem();
}
/**
* 使RecyclerView缓存中在pool中的Item失效
*/
private void invalidateCacheItem() {
Class<RecyclerView> recyclerViewClass = RecyclerView.class;
try {
Field declaredField = recyclerViewClass.getDeclaredField("mRecycler");
declaredField.setAccessible(true);
Method declaredMethod = Class.forName(RecyclerView.Recycler.class.getName()).getDeclaredMethod("clear", (Class<?>[]) new Class[0]);
declaredMethod.setAccessible(true);
declaredMethod.invoke(declaredField.get(recyclerView), new Object[0]);
RecyclerView.RecycledViewPool recycledViewPool = recyclerView.getRecycledViewPool();
recycledViewPool.clear();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void smoothToTop() {
int firstVisiblePosition = mLinearLayoutManager.findFirstVisibleItemPosition();
if (firstVisiblePosition < 11) {
recyclerView.smoothScrollToPosition(0);
} else {
recyclerView.smoothScrollToPosition(10);
recyclerView.smoothScrollToPosition(0);
}
recyclerView.clearFocus();
}
/*普通逻辑*/
/*生命周期回调*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
L.i(TAG, "onCreateView " + this);
L.i(TAG, getThemeNumber() + " : " + getThemeId());
View viewRoot= inflater.inflate(R.layout.fragment_theme_stories, container, false);
ButterKnife.bind(this, viewRoot);
return viewRoot;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
L.i(TAG, "onViewCreated " + this);
super.onViewCreated(view, savedInstanceState);
mLinearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLinearLayoutManager);
recyclerView.setAdapter(mAdapter);
swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_dark,
android.R.color.holo_blue_light, android.R.color.holo_green_dark,
android.R.color.holo_green_light);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
isDataLoaded = false;
themeStoryPresenter.refresh(mThemeId);
}
});
recyclerView.setOnLoadMoreListener(new LoadMoreRecyclerView.onLoadMoreListener() {
@Override
public void onLoadMore() {
recyclerView.setLoadingMore(true);
themeStoryPresenter.loadMore(mThemeId,mLastStoryId);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
}
});
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
L.i(TAG, "onActivityCreated " + this);
super.onActivityCreated(savedInstanceState);
mThemeId = getThemeId();
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (!isDataLoaded) {
themeStoryPresenter.refresh(mThemeId);
}
}
});
}
/*生命周期回调*/
}