package com.simtice.cnbeta.ui; import java.lang.ref.WeakReference; import java.lang.reflect.Type; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import com.actionbarsherlock.app.SherlockFragment; import com.google.gson.reflect.TypeToken; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.j256.ormlite.dao.Dao; import com.simtice.cnbeta.R; import com.simtice.cnbeta.adapter.NewsListAdapter; import com.simtice.cnbeta.bean.NewsList; import com.simtice.cnbeta.db.DatabaseHelper; import com.simtice.cnbeta.util.CommonLog; import com.simtice.cnbeta.util.CommonUtil; import com.simtice.cnbeta.util.Constant; import com.simtice.cnbeta.util.ExceptionUtil; import com.simtice.cnbeta.util.HttpUtil; import com.simtice.cnbeta.util.JsonUtil; /** * 新闻列表界面 * * @author simtice * */ public class NewsListFragment extends SherlockFragment { private PullToRefreshListView listView; private List<NewsList> list; private BaseAdapter adapter; private CommonLog log; private Dao<NewsList, Integer> newsListDao = null; @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); try { newsListDao.delete(newsListDao.queryForAll()); for (NewsList newsList : list) { newsListDao.create(newsList); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log = new CommonLog("MainNewsListActivity"); } private void getNewsList(final int type, final long articleID) { final MyHandler handler = new MyHandler(this); new Thread(new Runnable() { @Override public void run() { HttpUtil util = new HttpUtil(getActivity().getApplicationContext(), handler); util.requestNewsList(Constant.URL_GETNEWSLIST, type, articleID); } }).start(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.news_list, container, false); listView = (PullToRefreshListView) view.findViewById(R.id.pl_main_list); list = new ArrayList<NewsList>(); adapter = new NewsListAdapter(list, getActivity(), listView); listView.setAdapter(adapter); try { newsListDao = DatabaseHelper.getHelper(getActivity()).getNewslistDataDao(); list.addAll(newsListDao.queryForAll()); for (NewsList news : list) { log.i(news.getTheme()); log.i(news.getTopicLogo()); log.i("-------------------------------"); } adapter.notifyDataSetChanged(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } listView.setOnRefreshListener(new OnRefreshListener2<ListView>() { @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub getNewsList(Constant.TPYE_PULL_DOWN, 0); } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub getNewsList(Constant.TPYE_PULL_UP, list.get(list.size() - 1).getArticleID()); } }); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Intent intent = new Intent(getActivity(), NewsDetailActivity.class); intent.putExtra("ArticleID", list.get(arg2 - 1).getArticleID());// 因为listview下拉刷新的机制,要-1 intent.putExtra("title", list.get(arg2 - 1).getTitle()); startActivity(intent); } }); listView.setRefreshing(false);// 设置正在刷新 需要修改PullToRefreshListView // onRefreshing方法中把adapter.isEmpty()去掉,否则第一次进来不会刷新 // 必须要在setAdapter之后 return view; } /** * ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用 。 * Handler类应该应该为static类型,否则有可能造成泄露 * 。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类 * ,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。 * * @author simtice * */ static class MyHandler extends Handler { WeakReference<NewsListFragment> mFragment; MyHandler(NewsListFragment fragment) { mFragment = new WeakReference<NewsListFragment>(fragment); } @Override public void handleMessage(Message msg) { NewsListFragment fragment = mFragment.get(); if (fragment.getActivity() == null) return; switch (msg.what) { case Constant.REQUEST_SUCCESS: fragment.log.d(msg.obj); Type listType = new TypeToken<ArrayList<NewsList>>() { }.getType(); try { List<NewsList> temp = JsonUtil.parseBeanFromJson((String) msg.obj, listType); if (msg.arg1 == Constant.TPYE_PULL_DOWN) { fragment.list.clear();// 如果是下拉刷新就先清除数据 fragment.list.addAll(temp); fragment.listView.setMode(Mode.BOTH); } else if (msg.arg1 == Constant.TPYE_PULL_UP) fragment.list.addAll(temp); fragment.adapter.notifyDataSetChanged(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); ExceptionUtil.handlException(e, fragment.getActivity()); } fragment.listView.onRefreshComplete(); break; case Constant.REQUEST_FAILED: ExceptionUtil.handlException((Exception) msg.obj, fragment.getActivity()); fragment.listView.onRefreshComplete(); break; case Constant.NO_NETWORK: CommonUtil.showNoNetworkToast(fragment.getActivity()); fragment.listView.onRefreshComplete(); break; } } } }