package com.cnblogs.android; import java.util.ArrayList; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ImageButton; //import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView.OnItemClickListener; import com.cnblogs.android.adapter.NewsListAdapter; import com.cnblogs.android.controls.PullToRefreshListView; import com.cnblogs.android.controls.PullToRefreshListView.OnRefreshListener; import com.cnblogs.android.core.Config; import com.cnblogs.android.core.NewsHelper; import com.cnblogs.android.dal.NewsDBHelp; import com.cnblogs.android.entity.News; import com.cnblogs.android.utility.NetHelper; /** * �����б� * @author walkingp * @date:2011-12 * */ public class NewsActivity extends SuperMainView { List<News> listNews = new ArrayList<News>(); NewsListAdapter adapter; int pageIndex = 1;// ҳ�� ListView listView; private ImageButton refresh_btn; // ͷ��ˢ�°�ť ProgressBar news_progress_bar; // ͷ�����ذ�ť ProgressBar newsBody_progressBar;// ������� LinearLayout viewFooter;// footer view TextView tvFooterMore;// �ײ�������ʾ ProgressBar list_footer_progress;// �ײ������� private int lastItem; static final int MENU_DETAIL = Menu.FIRST;// �鿴��ϸ static final int MENU_COMMENT = Menu.FIRST + 1;// �鿴���� static final int MENU_VIEW_BROWSER = Menu.FIRST + 2;// ��������в鿴 static final int MENU_SHARE_TO = Menu.FIRST + 3;// ���� Resources res;// ��Դ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.news_layout); res = this.getResources(); InitialControls(); InitialNewsList(); BindEvent(); UpdateListViewReceiver receiver=new UpdateListViewReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("android.cnblogs.com.update_newslist"); registerReceiver(receiver, filter); } /** * ��ʼ���б� */ private void InitialControls() { listView = (ListView) findViewById(R.id.news_list); listView.removeAllViewsInLayout(); newsBody_progressBar = (ProgressBar) findViewById(R.id.newsList_progressBar); newsBody_progressBar.setVisibility(View.VISIBLE); // ˢ�� refresh_btn = (ImageButton) findViewById(R.id.news_refresh_btn); news_progress_bar = (ProgressBar) findViewById(R.id.news_progressBar); // �ײ�view LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); viewFooter = (LinearLayout) mInflater.inflate(R.layout.listview_footer, null, false); } /** * ���س�ʼ����(��ʼ��) */ private void InitialNewsList() { new PageTask(0, true).execute(); } /** * ���¼� */ private void BindEvent() { // ˢ�� refresh_btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { new PageTask(1, true).execute(); } }); // ����ˢ�� ((PullToRefreshListView) listView) .setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new PageTask(-1, true).execute(); } }); // ����ˢ�� listView.setOnScrollListener(new OnScrollListener() { /** * ���������һ�� */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (lastItem == adapter.getCount() && scrollState == OnScrollListener.SCROLL_STATE_IDLE) { pageIndex = pageIndex + 1; new PageTask(pageIndex, false).execute(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lastItem = firstVisibleItem - 2 + visibleItemCount; } }); // �����ת listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { RedirectDetailActivity(v); } }); // �����¼� listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle("��ѡ�����"); menu.add(0, MENU_DETAIL, 0, "�鿴����"); menu.add(0, MENU_COMMENT, 0, "�鿴����"); menu.add(0, MENU_VIEW_BROWSER, 0, "��������в鿴"); menu.add(0, MENU_SHARE_TO, 0, "��������"); } }); } // �����˵���Ӧ���� @Override public boolean onContextItemSelected(MenuItem item) { int itemIndex = item.getItemId(); AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); View v = menuInfo.targetView; switch (itemIndex) { case MENU_DETAIL :// ��ϸ RedirectDetailActivity(v); break; case MENU_COMMENT :// ���� RedirectCommentActivity(v); break; case MENU_VIEW_BROWSER :// ��������в鿴 ViewInBrowser(v); break; case MENU_SHARE_TO :// ���� ShareTo(v); break; } return super.onContextItemSelected(item); } /** * ���߳������������������ء���ʼ�������ؼ��ء�ˢ�£� * */ public class PageTask extends AsyncTask<String, Integer, List<News>> { boolean isRefresh = false; int curPageIndex = 0; boolean isLocalData = false;// �Ƿ��Ǵӱ��ض�ȡ������ NewsDBHelp dbHelper = new NewsDBHelp(getApplicationContext()); public PageTask(int page, boolean isRefresh) { curPageIndex = page; this.isRefresh = isRefresh; } protected List<News> doInBackground(String... params) { boolean isNetworkAvailable = NetHelper .networkIsAvailable(getApplicationContext()); int _pageIndex = curPageIndex; if (_pageIndex <= 0) { _pageIndex = 1; } // ���ȶ�ȡ�������� List<News> listNewsLocal = dbHelper.GetNewsListByPage(_pageIndex, Config.NEWS_PAGE_SIZE); if (isNetworkAvailable) {// ��������� List<News> listNewsNew = NewsHelper.GetNewsList(_pageIndex); switch (curPageIndex) { case -1 :// ����\ List<News> listTmp = new ArrayList<News>(); if (listNews != null && listNews.size() > 0) { if (listNewsNew != null && listNewsNew.size() > 0) { int size = listNewsNew.size(); for (int i = 0; i < size; i++) { if (!listNews.contains(listNewsNew.get(i))) {// ��������ظ� listTmp.add(listNewsNew.get(i)); } } } } return listTmp; case 0 :// �״μ��� case 1 :// ˢ�� if (listNewsNew != null && listNewsNew.size() > 0) { return listNewsNew; } break; default :// ���� List<News> listT = new ArrayList<News>(); if (listNews != null && listNews.size() > 0) {// ������ҳ������ʱ if (listNewsNew != null && listNewsNew.size() > 0) { int size = listNewsNew.size(); for (int i = 0; i < size; i++) { if (!listNews.contains(listNewsNew.get(i))) {// ��������ظ� listT.add(listNewsNew.get(i)); } } } } return listT; } } else {// ��������� isLocalData = true; if (curPageIndex == -1) {// �������������� return null; } return listNewsLocal; } return null; } @Override protected void onCancelled() { super.onCancelled(); } /** * �������� */ @Override protected void onPostExecute(List<News> result) { // ���Ͻ� news_progress_bar.setVisibility(View.GONE); refresh_btn.setVisibility(View.VISIBLE); // ���粻���ò��ұ���û�б������� if (result == null || result.size() == 0) {// û�������� ((PullToRefreshListView) listView).onRefreshComplete(); if (!NetHelper.networkIsAvailable(getApplicationContext()) && curPageIndex > 1) {// ��������û������ Toast.makeText(getApplicationContext(), R.string.sys_network_error, Toast.LENGTH_SHORT) .show(); // listView.removeFooterView(viewFooter); } return; } int size = result.size(); if (size >= Config.BLOG_PAGE_SIZE && listView.getFooterViewsCount() == 0) { listView.addFooterView(viewFooter); } // ���浽���ݿ� if (!isLocalData) { dbHelper.SynchronyData2DB(result); } dbHelper.Close(); if (curPageIndex == -1) {// ����ˢ�� adapter.InsertData(result); } else if (curPageIndex == 0) {// �״μ��� listNews = result; newsBody_progressBar.setVisibility(View.GONE); adapter = new NewsListAdapter(getApplicationContext(), listNews); listView.setAdapter(adapter); // ���ݲ��� ((PullToRefreshListView) listView).SetDataRow(listNews.size()); ((PullToRefreshListView) listView) .SetPageSize(Config.NEWS_PAGE_SIZE); } else if (curPageIndex == 1) {// ˢ�� if (adapter != null && adapter.GetData() != null) { adapter.GetData().clear(); adapter.AddMoreData(result); } else { adapter = new NewsListAdapter(getApplicationContext(), listNews); listView.setAdapter(adapter); } newsBody_progressBar.setVisibility(View.GONE); } else {// ���� adapter.AddMoreData(result); } if (isRefresh) {// ˢ��ʱ���� ((PullToRefreshListView) listView).onRefreshComplete(); } } @Override protected void onPreExecute() { // ��������� if (listView.getCount() == 0) { newsBody_progressBar.setVisibility(View.VISIBLE); } // ���Ͻ� news_progress_bar.setVisibility(View.VISIBLE); refresh_btn.setVisibility(View.GONE); if (!isRefresh) {// �ײ��ؼ���ˢ��ʱ�������� TextView tvFooterMore = (TextView) findViewById(R.id.tvFooterMore); tvFooterMore.setText(R.string.pull_to_refresh_refreshing_label); tvFooterMore.setVisibility(View.VISIBLE); ProgressBar list_footer_progress = (ProgressBar) findViewById(R.id.list_footer_progress); list_footer_progress.setVisibility(View.VISIBLE); } } @Override protected void onProgressUpdate(Integer... values) { } } // ****************************************����Ϊ�˵����� /** * ��ת������ * * @param v */ private void RedirectCommentActivity(View v) { TextView tvNewsComment = (TextView) (v .findViewById(R.id.news_text_comments)); TextView tvNewsId = (TextView) (v.findViewById(R.id.news_text_id)); TextView tvNewsTitle = (TextView) (v.findViewById(R.id.news_text_title)); TextView tvNewsUrl = (TextView) (v.findViewById(R.id.news_text_url)); int newsId = Integer.parseInt(tvNewsId.getText().toString()); int commentCount = Integer.parseInt(tvNewsComment.getText().toString()); String newsTitle = tvNewsTitle.getText().toString(); String newsUrl = tvNewsUrl.getText().toString(); // ��û������ if (commentCount == 0) { Toast.makeText(getApplicationContext(), R.string.sys_empty_comment, Toast.LENGTH_SHORT).show(); return; } Intent intent = new Intent(); intent.setClass(NewsActivity.this, CommentActivity.class); Bundle bundle = new Bundle(); bundle.putInt("contentId", newsId); bundle.putInt("commentType", 1);// Comment.EnumCommentType.News.ordinal()); bundle.putString("title", newsTitle); bundle.putString("url", newsUrl); intent.putExtras(bundle); startActivityForResult(intent, 0); } /** * �鿴���� * * @param v */ private void RedirectDetailActivity(View v) { Intent intent = new Intent(); try { // ���ݲ��� intent.setClass(NewsActivity.this, NewsDetailActivity.class); Bundle bundle = new Bundle(); TextView tvNewsId = (TextView) (v.findViewById(R.id.news_text_id)); TextView tvNewsTitle = (TextView) (v .findViewById(R.id.news_text_title)); TextView tvNewsDate = (TextView) (v .findViewById(R.id.news_text_date)); TextView tvNewsUrl = (TextView) (v.findViewById(R.id.news_text_url)); TextView tvNewsComment = (TextView) (v .findViewById(R.id.news_text_comments)); TextView tvNewsView = (TextView) (v .findViewById(R.id.news_text_view)); String newsId = tvNewsId.getText().toString(); String newsTitle = tvNewsTitle.getText().toString(); String newsDate = tvNewsDate.getText().toString(); String newsUrl = tvNewsUrl.getText().toString(); int view = Integer.parseInt(tvNewsView.getText().toString()); int comment = Integer.parseInt(tvNewsComment.getText().toString()); bundle.putString("newsId", newsId); bundle.putString("newsTitle", newsTitle); bundle.putString("date", newsDate); bundle.putString("newsUrl", newsUrl); bundle.putInt("view", view); bundle.putInt("comment", comment); Log.d("newsId", newsId.toString()); intent.putExtras(bundle); startActivityForResult(intent, 0); tvNewsTitle.setTextColor(R.color.gray); } catch (Exception ex) { ex.printStackTrace(); } } /** * ��������в鿴 * * @param v */ private void ViewInBrowser(View v) { TextView tvBlogUrl = (TextView) (v.findViewById(R.id.news_text_url)); String blogUrl = tvBlogUrl.getText().toString(); Uri blogUri = Uri.parse(blogUrl); Intent it = new Intent(Intent.ACTION_VIEW, blogUri); startActivity(it); } /** * ���� * * @param v */ private void ShareTo(View v) { TextView tvNewsTitle = (TextView) (v.findViewById(R.id.news_text_title)); String newsTitle = tvNewsTitle.getText().toString(); TextView tvNewsUrl = (TextView) (v.findViewById(R.id.news_text_url)); String newsUrl = tvNewsUrl.getText().toString(); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "��ѡ�������"); String shareContent = "��" + newsTitle + "����ԭ�����ӣ�" + newsUrl + " �����ԣ�" + res.getString(R.string.app_name) + "Android�ͻ���(" + res.getString(R.string.app_homepage) + ")"; intent.putExtra(Intent.EXTRA_TEXT, shareContent); startActivity(Intent.createChooser(intent, newsTitle)); } /** * ����ListViewΪ�Ѷ�״̬ * @author walknigp * */ public class UpdateListViewReceiver extends BroadcastReceiver{ @Override public void onReceive(Context content, Intent intent) { /*Bundle bundle=intent.getExtras(); int[] newsIdArr=bundle.getIntArray("newsIdArray"); for(int i=0,len=listView.getChildCount();i<len;i++){ View view=listView.getChildAt(i); TextView tvId=(TextView)view.findViewById(R.id.news_text_id); int newsId=Integer.parseInt(tvId.getText().toString()); ImageView icoDown=(ImageView)view.findViewById(R.id.icon_downloaded); TextView tvTitle=(TextView)view.findViewById(R.id.news_text_title); for(int j=0,size=newsIdArr.length;j<size;j++){ if(newsId==newsIdArr[j]){ icoDown.setVisibility(View.VISIBLE);//�Ѿ����� tvTitle.setTextColor(R.color.gray);//�Ѷ� } } }*/ } } }