package jianshu.io.app.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import net.tsz.afinal.FinalBitmap; import it.gmariotti.cardslib.library.internal.Card; import jianshu.io.app.ArticleActivity; import jianshu.io.app.R; import jianshu.io.app.adapter.JianshuCardArrayAdapter; import jianshu.io.app.card.HomeCard; import jianshu.io.app.card.HotCard; import jianshu.io.app.card.JianshuBaseCard; import jianshu.io.app.model.ArticleItem; import jianshu.io.app.model.JianshuSession; import jianshu.io.app.model.StatePool; import jianshu.io.app.model.datapool.DataPool; import jianshu.io.app.util.DataPoolAsyncTask; import jianshu.io.app.widget.EndlessCardListView; import jianshu.io.app.widget.EndlessListener; import jianshu.io.app.widget.LoadingTextView; /** * Created by Administrator on 2014/5/7. */ public class CardFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, EndlessListener, JianshuCardArrayAdapter.CardClickListener { public static CardFragment newInstance(String url) { CardFragment fragment = new CardFragment(); Bundle bundle = new Bundle(); bundle.putString("url", url); fragment.setArguments(bundle); return fragment; } FinalBitmap fb; EndlessCardListView mContentView; SwipeRefreshLayout mRefreshLayout; JianshuCardArrayAdapter mAdapter; LoadingTextView mFooter; DataPool mPool; View mEmptyView; boolean mIsEmpty; String mUrl; int[] mListViewState; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = getActivity().getLayoutInflater().inflate(R.layout.hot, null); final Activity activity = getActivity(); this.fb = FinalBitmap.create(activity); mUrl = getArguments().getString("url"); Object[] states = StatePool.getInstance().getFragmentState(getActivity(), mUrl); mPool = (DataPool) states[0]; mAdapter = (JianshuCardArrayAdapter) states[1]; mAdapter.setCardClickListener(this); if (states[2] != null) { mListViewState = (int[]) states[2]; } mEmptyView = getActivity().getLayoutInflater().inflate(R.layout.empty_pull, null); mContentView = (EndlessCardListView) (view.findViewById(R.id.hotlist)); mContentView.setListener(this); mFooter = (LoadingTextView) activity.getLayoutInflater().inflate(R.layout.footer, null); mContentView.setFooter(mFooter); mContentView.setAdapter(mAdapter); mRefreshLayout = (SwipeRefreshLayout) (view.findViewById(R.id.ptr_layout)); mRefreshLayout.setColorScheme(R.color.jianshu, R.color.card_list_gray, R.color.jianshu, R.color.card_list_gray); mRefreshLayout.setOnRefreshListener(this); return view; } @Override public void onViewStateRestored(Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (mListViewState != null) { mContentView.setSelectionFromTop(mListViewState[0], mListViewState[1]); } } @Override public void onResume() { super.onResume(); //判断userInfo是否有变化 boolean isUserInfoChanged = true; String cachedSession = mAdapter.getSession(); String currentSession = JianshuSession.getsInstance().getSession(); if((currentSession == null && cachedSession == null) || ((currentSession != null && cachedSession != null) && currentSession.equals(cachedSession))) { isUserInfoChanged = false; } mAdapter.setSession(currentSession); if (isUserInfoChanged || mAdapter.getCount() == 0) { mRefreshLayout.setRefreshing(true); onRefresh(); } else { mAdapter.notifyDataSetChanged(); } } @Override public void onPause() { super.onPause(); int index = mContentView.getFirstVisiblePosition(); View v = mContentView.getChildAt(0); int top = (v == null) ? 0 : v.getTop(); StatePool.getInstance().putListViewState(mUrl, new int[]{index, top}); } private Card[] initCard(final Context context, Object[] data) { Card[] result = new Card[data.length]; int i = 0; for (Object temp : data) { ArticleItem item = (ArticleItem)temp; final JianshuBaseCard card; String summary = item.getSummary(); if (summary != null && summary.length() > 0) { card = new HomeCard(context, item, this.fb); // CardHeader header = new HotCardHeader(context); // header.setTitle(item.getTitle()); // card.addCardHeader(header); // HotCardExpand expand = new HotCardExpand(context); // expand.setSummary(item.getSummary()); // card.addCardExpand(expand); } else { card = new HotCard(context, item, this.fb); } result[i++] = card; card.addPartialOnClickListener(Card.CLICK_LISTENER_CONTENT_VIEW, new Card.OnCardClickListener() { @Override public void onClick(Card card, View view) { mAdapter.onClick(card); } }); } return result; } @Override public void onRefresh() { new DataPoolAsyncTask(true, this.mPool, new DataPoolAsyncTask.OnPostExecuteTask() { @Override public void run(Exception e, Object[] data) { mRefreshLayout.setRefreshing(false); Context context = getActivity(); if (context == null) { return; } if (data != null) { if (mIsEmpty) { mIsEmpty = false; mRefreshLayout.removeView(mEmptyView); mRefreshLayout.addView(mContentView); } else { mAdapter.clear(); } mAdapter.addAll(initCard(context, data)); } else { if (context != null) { Toast.makeText(context, ":( 加载失败,请重试", Toast.LENGTH_LONG).show(); } if (mAdapter.getCount() == 0 && !mIsEmpty) { mIsEmpty = true; mRefreshLayout.removeView(mContentView); mRefreshLayout.addView(mEmptyView); } } } }).execute(); } @Override public boolean isAtTheEnd() { return mPool.isAtTheEnd(); } @Override public void onScrollEnd() { mFooter.startAnimation(); new DataPoolAsyncTask(false, this.mPool, new DataPoolAsyncTask.OnPostExecuteTask() { @Override public void run(Exception e, Object[] data) { mFooter.endAnimation(); mContentView.notifyNewDataLoaded(); Context context = getActivity(); if (context == null) { return; } if (data != null) { mAdapter.addAll(initCard(context, data)); } else { Toast.makeText(context, ":( 加载失败,请重试", Toast.LENGTH_LONG).show(); } } }).execute(); } @Override public void onClick(Card card) { Context context = getActivity(); ArticleItem item = ((JianshuBaseCard) card).getItem(); Intent intent = new Intent(context, ArticleActivity.class); intent.putExtra("url", item.getUrl()); intent.putExtra("title", item.getTitle()); intent.putExtra("summary", item.getSummary()); intent.putExtra("author", item.getAuthor()); getActivity().startActivity(intent); getActivity().overridePendingTransition(R.anim.slide_in_left, 0); } public interface HotFragmentListner { void onRefreshStart(); void onRefreshEnd(); } }