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.app.AppCompatActivity; 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.DaggerDailyStoryComponent; import io.hefuyi.zhihudaily.injector.component.DailyStoryComponent; import io.hefuyi.zhihudaily.injector.module.ActivityModule; import io.hefuyi.zhihudaily.injector.module.DailyStoryModule; import io.hefuyi.zhihudaily.mvp.contract.DailyStoryContract; import io.hefuyi.zhihudaily.mvp.model.DailyStories; import io.hefuyi.zhihudaily.ui.activity.NavigationDrawerActivity; import io.hefuyi.zhihudaily.ui.adapter.DailyStoriesAdapter; import io.hefuyi.zhihudaily.ui.adapter.holder.DateViewHolder; import io.hefuyi.zhihudaily.util.L; import io.hefuyi.zhihudaily.widget.LoadMoreRecyclerView; import io.hefuyi.zhihudaily.widget.MyViewPager; /** * A simple {@link Fragment} subclass. */ public class DailyStoriesFragment extends BaseFragment implements DailyStoryContract.View{ public static final String TAG = DailyStoriesFragment.class.getSimpleName(); @Inject DailyStoryContract.Presenter dailyStoryPresenter; @Bind(R.id.swipeRefreshLayout) SwipeRefreshLayout swipeRefreshLayout; @Bind(R.id.recyclerView) LoadMoreRecyclerView recyclerView; private LinearLayoutManager mLinearLayoutManager; private DailyStoriesAdapter mAdapter; private String mDate; private boolean isDataLoaded; /*初始化相关*/ @Override public void onCreate(@Nullable Bundle savedInstanceState) { L.i(TAG, "onCreate " + this); super.onCreate(savedInstanceState); injectDependences(); dailyStoryPresenter.attachView(this); mAdapter = new DailyStoriesAdapter(); } private void injectDependences() { ApplicationComponent applicationComponent = ((NavigationDrawerActivity) getActivity()).getApplicationComponent(); DailyStoryComponent dailyStoryComponent = DaggerDailyStoryComponent.builder() .applicationComponent(applicationComponent) .activityModule(new ActivityModule(getActivity())) .dailyStoryModule(new DailyStoryModule()) .build(); dailyStoryComponent.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 hideRefreshing() { Runnable runnable = new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }; getActivity().runOnUiThread(runnable); } @Override public void showRefreshing() { Runnable runnable = new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(true); } }; getActivity().runOnUiThread(runnable); } @Override public void showStory(final DailyStories dailyStories) { Runnable runnable = new Runnable() { @Override public void run() { if (dailyStories == null) { isDataLoaded = false; } else { isDataLoaded = true; mDate = dailyStories.getDate(); mAdapter.setList(dailyStories); } } }; getActivity().runOnUiThread(runnable); } @Override public void appendStory(final DailyStories dailyStories) { Runnable runnable = new Runnable() { @Override public void run() { if (dailyStories != null) { mDate = dailyStories.getDate(); mAdapter.appendList(dailyStories); } } }; getActivity().runOnUiThread(runnable); } /*view接口方法*/ /*普通逻辑*/ @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 void refreshUI() { TypedValue itemDateTextColor = new TypedValue(); TypedValue itemStoryTextColor = new TypedValue(); TypedValue itemStoryBackground = new TypedValue(); TypedValue windowBackground = new TypedValue(); Resources.Theme theme = getActivity().getTheme(); theme.resolveAttribute(R.attr.item_date_text_color, itemDateTextColor, true); 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 = 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 DailyStoriesAdapter.Type.TYPE_HEADER: break; case DailyStoriesAdapter.Type.TYPE_DATE: TextView textView = (TextView) recyclerView.getChildAt(childIndex); textView.setTextColor(resources.getColor(itemDateTextColor.resourceId)); break; case DailyStoriesAdapter.Type.TYPE_STORY: 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(); } } private String mTitle; private int lastTitLePos = -1; private void changeActionBarTitle(int dy) { int position = mLinearLayoutManager.findFirstVisibleItemPosition(); if (lastTitLePos == position) { return; } DailyStoriesAdapter.Item item = mAdapter.getItem(position); int type = item.getType(); if (type == DailyStoriesAdapter.Type.TYPE_HEADER) { mTitle = getString(R.string.title_activity_main); } else if (dy > 0 && type == DailyStoriesAdapter.Type.TYPE_DATE) { mTitle = DateViewHolder.getDate(item.getDate(), getActivity()); } else if (dy < 0) { mTitle = DateViewHolder.getDate(mAdapter.getTitleBeforePosition(position), getActivity()); } ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(mTitle); lastTitLePos = position; } /*普通逻辑*/ /*生命周期回调*/ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView= inflater.inflate(R.layout.fragment_daily_strories, container, false); ButterKnife.bind(this,rootView); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mLinearLayoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(mLinearLayoutManager); 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() { dailyStoryPresenter.refresh(); } }); recyclerView.setOnLoadMoreListener(new LoadMoreRecyclerView.onLoadMoreListener() { @Override public void onLoadMore() { dailyStoryPresenter.loadMore(mDate); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { changeActionBarTitle(dy); } }); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); recyclerView.setAdapter(mAdapter); swipeRefreshLayout.post(new Runnable() { @Override public void run() { if (!isDataLoaded) { dailyStoryPresenter.refresh(); } } }); } @Override public void onResume() { super.onResume(); if (recyclerView != null) { L.i(TAG, "recyclerView != null"); View view = recyclerView.findViewById(R.id.viewPager); if (view != null) { L.i(TAG, "MyViewPager startAutoScroll"); ((MyViewPager) view).startAutoScroll(); } } } @Override public void onPause() { super.onPause(); if (recyclerView != null) { L.i(TAG, "revyvlerView !=null"); View view = recyclerView.findViewById(R.id.viewPager); if (view != null) { L.i(TAG, "MyViewPager stopAutoScroll"); ((MyViewPager) view).stopAutoScroll(); } } } /*生命周期回调*/ }