package com.roboo.like.netease.fragment; import java.io.IOException; import java.util.LinkedList; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; import com.roboo.like.netease.MainActivity; import com.roboo.like.netease.NewsActivity; import com.roboo.like.netease.NewsApplication; import com.roboo.like.netease.R; import com.roboo.like.netease.WebViewActivity; import com.roboo.like.netease.abs.ptr.PullToRefreshAttacher; import com.roboo.like.netease.adapter.MainListViewAdapter; import com.roboo.like.netease.dao.INewsDao; import com.roboo.like.netease.dao.impl.NewsDaoImpl; import com.roboo.like.netease.database.DBHelper; import com.roboo.like.netease.model.News; import com.roboo.like.netease.model.NewsCategory; import com.roboo.like.netease.utils.NewsUtils; public class MainFragment extends Fragment implements PullToRefreshAttacher.OnRefreshListener { private int pageNo = 0; private PullToRefreshAttacher mPullToRefreshAttacher; private LinearLayout mFooterView; private ProgressBar mProgressBar; private LinkedList<News> mData; private TextView mTVText; private static final String ARG_NEWS_CATEGORY = "newsCategory"; private ListView mListView; private NewsCategory mNewsCategory; private MainListViewAdapter mAdapter; private SharedPreferences mPreferences; public static MainFragment newInstance(NewsCategory category) { MainFragment mainFragment = new MainFragment(); Bundle bundle = new Bundle(); if (null != category) { bundle.putSerializable(ARG_NEWS_CATEGORY, category); } mainFragment.setArguments(bundle); return mainFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreferences = getActivity().getSharedPreferences(getActivity().getPackageName(), Context.MODE_PRIVATE); mNewsCategory = (NewsCategory) getArguments().getSerializable(ARG_NEWS_CATEGORY); if (getActivity() instanceof MainActivity) { mPullToRefreshAttacher = ((MainActivity) getActivity()).getPullToRefreshAttacher(); } else if (getActivity() instanceof NewsActivity) { mPullToRefreshAttacher = ((NewsActivity) getActivity()).getPullToRefreshAttacher(); } initData(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return createView(inflater); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setAdapter(); setListItemClickListener(); setFooterViewClickListener(); } /** 判断数据源是否为空,并做相应的处理 */ private void setAdapter() { if (null == mData || (System.currentTimeMillis() - mPreferences.getLong(mNewsCategory.getNewsCategoryMD5(), System.currentTimeMillis())) > NewsApplication.REFRESH_INTERVAL_1_MINUTE) { mFooterView.setVisibility(View.GONE); mPreferences.edit().putLong(mNewsCategory.getNewsCategoryMD5(), System.currentTimeMillis()).commit(); mPullToRefreshAttacher.setRefreshing(true); onRefreshStarted(mListView); } else { mAdapter = new MainListViewAdapter(getActivity(), mData, ImageLoader.getInstance()); mListView.setAdapter(mAdapter); } } /** ListView的FooterView的点击事件 */ private void setFooterViewClickListener() { mFooterView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pageNo++; mTVText.setText(getActivity().getString(R.string.tv_progressing)); mProgressBar.setVisibility(View.VISIBLE); new GetNewsDataAsyncTask().execute(); } }); } /** ListView列表项点击事件 */ private void setListItemClickListener() { mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { News news = (News) parent.getItemAtPosition(position); Intent intent = new Intent(getActivity(), WebViewActivity.class); intent.putExtra("newsUrl", news.getUrl()); startActivity(intent); } }); } private View createView(LayoutInflater inflater) { FrameLayout frameLayout = new FrameLayout(getActivity()); frameLayout.setBackgroundResource(R.drawable.background_card); mListView = (ListView) inflater.inflate(R.layout.listview, null); mListView.addFooterView(generateFooterView(inflater)); mPullToRefreshAttacher.addRefreshableView(mListView, this); frameLayout.addView(mListView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return frameLayout; } /** 生成ListView的FooterView */ private View generateFooterView(LayoutInflater inflater) { mFooterView = (LinearLayout) inflater.inflate(R.layout.fragment_main_lisetview_footer_view, null); mProgressBar = (ProgressBar) mFooterView.findViewById(R.id.pb_progress); mTVText = (TextView) mFooterView.findViewById(R.id.tv_text); return mFooterView; } @Override public boolean getUserVisibleHint() { System.out.println("getUserVisibleHint = " + super.getUserVisibleHint()); // if(super.getUserVisibleHint()) // { // initData(); // } return super.getUserVisibleHint(); } private void initData() { INewsDao newsDao = new NewsDaoImpl(new DBHelper(getActivity())); mData = newsDao.getNewsList(mNewsCategory.getNewsCategoryMD5()); System.out.println("mdata.size() = " + (null != mData ? mData.size() : null)); } @Override public void onRefreshStarted(View view) { pageNo = 1; new GetNewsDataAsyncTask().execute(); } private final class GetNewsDataAsyncTask extends AsyncTask<Void, Void, LinkedList<News>> { @Override protected LinkedList<News> doInBackground(Void... params) { try { LinkedList<News> data = null; if (null != mNewsCategory) { data = NewsUtils.getITHomeNews(mNewsCategory.getNewsCategoryUrl(), pageNo); } return data; } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { } pageNo--; return null; } @Override protected void onPostExecute(LinkedList<News> result) { super.onPostExecute(result); if (null != result) { System.out.println("result.size() = " + result.size()); INewsDao newsDao = new NewsDaoImpl(new DBHelper(getActivity())); int insertSum = 0; if (pageNo == 1) { newsDao.delete(mNewsCategory.getNewsCategoryMD5()); mData = null; } else { for (News news : result) { insertSum += newsDao.insert(news, mNewsCategory.getNewsCategoryMD5()); } } System.out.println("insertSum = " + insertSum); if (null == mData) { mData = result; mAdapter = new MainListViewAdapter(getActivity(), mData, ImageLoader.getInstance()); mListView.setAdapter(mAdapter); } else { for (News news : result) { if (!mData.contains(news)) { mData.addLast(news); } } } if (null != mAdapter) { mAdapter.notifyDataSetChanged(); } mFooterView.setVisibility(View.VISIBLE); } mTVText.setText(getActivity().getString(R.string.tv_click_load_more)); mProgressBar.setVisibility(View.INVISIBLE); mPullToRefreshAttacher.setRefreshComplete(); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { if (null != getView()) { if (isVisibleToUser) { initData(); } } } }