package com.cnblogs.android.ui.tab1;
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.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.cnblogs.android.AuthorBlogActivity;
import com.cnblogs.android.CommentActivity;
import com.cnblogs.android.R;
import com.cnblogs.android.SuperMainView;
import com.cnblogs.android.controls.PullToRefreshListView;
import com.cnblogs.android.controls.PullToRefreshListView.OnRefreshListener;
import com.cnblogs.android.core.BlogHelper;
import com.cnblogs.android.core.Config;
import com.cnblogs.android.dal.BlogDBHelp;
import com.cnblogs.android.entity.Blog;
import com.cnblogs.android.utility.NetHelper;
/**
* �����б�
*
* @author walkingp
* @date:2011-12
*
*/
public class BlogListView extends SuperMainView {
List<Blog> listBlog = new ArrayList<Blog>();
ProgressBar blogBody_progressBar;// ����ListView���ؿ�
ImageButton blog_refresh_btn;// ˢ�°�ť
ProgressBar blog_progress_bar;// ���ذ�ť
// ListView
int pageIndex = 1;// ҳ��
ListView mListView;
private BlogListAdp dataAdp;// ����Դ
int loadMoreMode = 0;// ���ظ���ģʽ����0:����ײ����ظ��࣬1���������ײ����ظ���
// ListView�ײ��ؼ�
LinearLayout mListFootLayout;// footer view
// ProgressBar foot_progress;// �ײ�������
TextView foot_TextView;
Resources res;// ��Դ
private int lastItem;
BlogDBHelp dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.blog_layout);
res = this.getResources();
InitUI();
new PageTask(0, true).execute();
// ע��㲥
UpdateListViewReceiver receiver = new UpdateListViewReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.cnblogs.com.update_bloglist");
registerReceiver(receiver, filter);
}
/**
* ��ʼ���б�
*/
private void InitUI() {
mListView = (ListView) findViewById(R.id.blog_list);
blogBody_progressBar = (ProgressBar) findViewById(R.id.blogList_progressBar);
blogBody_progressBar.setVisibility(View.VISIBLE);
blog_refresh_btn = (ImageButton) findViewById(R.id.blog_refresh_btn);
blog_progress_bar = (ProgressBar) findViewById(R.id.blog_progressBar);
// �ײ�view
LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mListFootLayout = (LinearLayout) mInflater.inflate(
R.layout.listview_footer, null, false);
if (loadMoreMode == 0) {
mListFootLayout.setClickable(true);
mListFootLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(BlogListView.this, "�������",
// Toast.LENGTH_LONG)
// .show();
pageIndex = pageIndex + 1;
new PageTask(pageIndex, false).execute();
}
});
}
dbHelper = new BlogDBHelp(getApplicationContext());
// ˢ��
blog_refresh_btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new PageTask(1, true).execute();
}
});
// ����ˢ��
((PullToRefreshListView) mListView)
.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new PageTask(-1, true).execute();
}
});
// ����ˢ��
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// ���������һ��
if (lastItem == dataAdp.getCount()
&& scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
if (loadMoreMode == 1) {
pageIndex = pageIndex + 1;
new PageTask(pageIndex, false).execute();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
lastItem = firstVisibleItem - 2 + visibleItemCount;
}
});
// �����ת
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
RedirectDetailActivity(v);
}
});
// �����¼�
mListView
.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.blog_list_contextmenu, menu);
menu.setHeaderTitle(R.string.menu_bar_title);
}
});
}
/**
* ���߳������������������ء���ʼ�����������ء�ˢ�£�
*
*/
public class PageTask extends AsyncTask<String, Integer, List<Blog>> {
boolean isRefresh = false;
int curPage = 0;// ��ǰҳ��
boolean isLocalData = false;// �Ƿ��Ǵӱ��ض�ȡ������
public PageTask(int page, boolean isRefresh) {
curPage = page;
this.isRefresh = isRefresh;
}
protected List<Blog> doInBackground(String... params) {
boolean isNetworkAvailable = NetHelper
.networkIsAvailable(getApplicationContext());
int _pageIndex = curPage;
if (_pageIndex <= 0) {
_pageIndex = 1;
}
// ���ȶ�ȡ��������
List<Blog> listBlogLocal = dbHelper.GetBlogListByPage(_pageIndex,
Config.BLOG_PAGE_SIZE);
if (isNetworkAvailable) {// ���������
List<Blog> listBlogNew = BlogHelper.GetBlogList(_pageIndex);// ������ȡ�����б�
switch (curPage) {
case -1:// ����
List<Blog> listTmp = new ArrayList<Blog>();
if (listBlog != null && listBlog.size() > 0) {// ������ҳ������ʱ
if (listBlogNew != null && listBlogNew.size() > 0) {
int size = listBlogNew.size();
for (int i = 0; i < size; i++) {
if (!listBlog.contains(listBlogNew.get(i))) {// ��������ظ�
listTmp.add(listBlogNew.get(i));
}
}
}
}
return listTmp;
case 0:// �״μ���
case 1:// ˢ��
if (listBlogNew != null && listBlogNew.size() > 0) {
return listBlogNew;
}
break;
default:// ����
List<Blog> listT = new ArrayList<Blog>();
if (listBlog != null && listBlog.size() > 0) {// ������ҳ������ʱ
if (listBlogNew != null && listBlogNew.size() > 0) {
int size = listBlogNew.size();
for (int i = 0; i < size; i++) {
if (!listBlog.contains(listBlogNew.get(i))) {// ��������ظ�
listT.add(listBlogNew.get(i));
}
}
}
}
return listT;
}
} else {// ���������
isLocalData = true;
if (curPage == -1) {// ��������������
return null;
}
return listBlogLocal;
}
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
}
/**
* ��������
*/
@Override
protected void onPostExecute(List<Blog> result) {
// ���Ͻ�
blog_progress_bar.setVisibility(View.GONE);
blog_refresh_btn.setVisibility(View.VISIBLE);
// ���粻���ò��ұ���û�б�������
if (result == null || result.size() == 0) {// û��������
((PullToRefreshListView) mListView).onRefreshComplete();
if (!NetHelper.networkIsAvailable(getApplicationContext())
&& curPage > 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
&& mListView.getFooterViewsCount() == 0) {
mListView.addFooterView(mListFootLayout);// ��ӵײ�View
}
// ���浽���ݿ�
if (!isLocalData) {
dbHelper.SynchronyData2DB(result);
}
// ����ˢ��
if (curPage == -1) {
dataAdp.InsertData(result);
}
// �״μ���
else if (curPage == 0) {
listBlog = result;// dbHelper.GetTopBlogList();
blogBody_progressBar.setVisibility(View.GONE);
dataAdp = new BlogListAdp(getApplicationContext(), listBlog,
mListView);
mListView.setAdapter(dataAdp);
// ���ݲ���
((PullToRefreshListView) mListView).SetDataRow(listBlog.size());
((PullToRefreshListView) mListView)
.SetPageSize(Config.BLOG_PAGE_SIZE);
}
// ˢ��
else if (curPage == 1) {
try {// ������ҳ��������أ���ˢ�°�ť
listBlog = result;
if (dataAdp != null && dataAdp.GetData() != null) {
dataAdp.GetData().clear();
dataAdp.AddMoreData(listBlog);
} else if (result != null) {
dataAdp = new BlogListAdp(getApplicationContext(),
listBlog, mListView);
mListView.setAdapter(dataAdp);
}
// ���ݲ���
((PullToRefreshListView) mListView).SetDataRow(listBlog
.size());
((PullToRefreshListView) mListView)
.SetPageSize(Config.BLOG_PAGE_SIZE);
} catch (Exception ex) {
// Log.e("BlogActivity", ex.getMessage());
}
}
// ����
else {
dataAdp.AddMoreData(result);
}
// ˢ��ʱ����
if (isRefresh) {
((PullToRefreshListView) mListView).onRefreshComplete();
}
}
@Override
protected void onPreExecute() {
// ���������
if (mListView.getCount() == 0) {
blogBody_progressBar.setVisibility(View.VISIBLE);
}
// ���Ͻ�
blog_progress_bar.setVisibility(View.VISIBLE);
blog_refresh_btn.setVisibility(View.GONE);
if (!isRefresh) {// �ײ��ؼ���ˢ��ʱ��������
// foot_TextView = (TextView) findViewById(R.id.foot_TextView);
// foot_TextView.setText("���ظ���...");
// foot_TextView.setTextSize(20);
// foot_TextView.setGravity(Gravity.CENTER);
// foot_TextView.setOnClickListener(new OnClickListener() {
//
// @Override
// public void onClick(View v) {
// pageIndex = pageIndex + 1;
// new PageTask(pageIndex, false).execute();
//
// }
// });
// foot_TextView.setVisibility(View.VISIBLE);
// foot_progress = (ProgressBar) footLayout
// .findViewById(R.id.list_footer_progress);
// foot_progress.setVisibility(View.VISIBLE);
}
}
@Override
protected void onProgressUpdate(Integer... values) {
}
}
// ****************************************����Ϊ�˵�����
/**
* ��ת������
*
* @param v
*/
private void RedirectCommentActivity(View v) {
TextView tvBlogCommentCount = (TextView) (v
.findViewById(R.id.recommend_text_comments));
TextView tvBlogId = (TextView) (v.findViewById(R.id.recommend_text_id));
TextView tvBlogTitle = (TextView) (v
.findViewById(R.id.recommend_text_title));
TextView tvBlogUrl = (TextView) (v
.findViewById(R.id.recommend_text_url));
int blogId = Integer.parseInt(tvBlogId.getText().toString());
int commentCount = Integer.parseInt(tvBlogCommentCount.getText()
.toString());
String blogTitle = tvBlogTitle.getText().toString();
String blogUrl = tvBlogUrl.getText().toString();
// ��û������
if (commentCount == 0) {
Toast.makeText(getApplicationContext(), R.string.sys_empty_comment,
Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setClass(BlogListView.this, CommentActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("contentId", blogId);
bundle.putInt("commentType", 0);// Comment.EnumCommentType.News.ordinal());
bundle.putString("title", blogTitle);
bundle.putString("url", blogUrl);
intent.putExtras(bundle);
startActivity(intent);
}
/**
* ��ת������
*
* @param v
*/
private void RedirectDetailActivity(View v) {
Intent intent = new Intent();
try {
// ���ݲ���
intent.setClass(BlogListView.this, BlogDetailView.class);
Bundle bundle = new Bundle();
TextView tvBlogId = (TextView) (v
.findViewById(R.id.recommend_text_id));
TextView tvBlogTitle = (TextView) (v
.findViewById(R.id.recommend_text_title));
TextView tvBlogAuthor = (TextView) (v
.findViewById(R.id.recommend_text_author));
TextView tvBlogDate = (TextView) (v
.findViewById(R.id.recommend_text_date));
TextView tvBlogUrl = (TextView) (v
.findViewById(R.id.recommend_text_url));
TextView tvBlogViewCount = (TextView) (v
.findViewById(R.id.recommend_text_view));
TextView tvBlogCommentCount = (TextView) (v
.findViewById(R.id.recommend_text_comments));
TextView tvBlogDomain = (TextView) (v
.findViewById(R.id.recommend_text_domain));
int blogId = Integer.parseInt(tvBlogId.getText().toString());
String blogTitle = tvBlogTitle.getText().toString();
String blogAuthor = tvBlogAuthor.getText().toString();
String blogDate = tvBlogDate.getText().toString();
String blogUrl = tvBlogUrl.getText().toString();
String blogDomain = tvBlogDomain.getText().toString();
int viewsCount = Integer.parseInt(tvBlogViewCount.getText()
.toString());
int commentCount = Integer.parseInt(tvBlogCommentCount.getText()
.toString());
bundle.putInt("blogId", blogId);
bundle.putString("blogTitle", blogTitle);
bundle.putString("author", blogAuthor);
bundle.putString("date", blogDate);
bundle.putString("blogUrl", blogUrl);
bundle.putInt("view", viewsCount);
bundle.putInt("comment", commentCount);
bundle.putString("blogDomain", blogDomain);
Log.d("blogId", String.valueOf(blogId));
intent.putExtras(bundle);
startActivity(intent);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* ��������в鿴
*
* @param v
*/
private void ViewInBrowser(View v) {
TextView tvBlogUrl = (TextView) (v
.findViewById(R.id.recommend_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 RedirectAuthorActivity(View v) {
TextView tvUserName = (TextView) v
.findViewById(R.id.recommend_user_name);// �û���
String userName = tvUserName.getText().toString();
if (userName.equals("")) {
Toast.makeText(getApplicationContext(), R.string.sys_no_author,
Toast.LENGTH_SHORT).show();
return;
}
TextView tvBlogAuthor = (TextView) (v
.findViewById(R.id.recommend_text_author));
String blogAuthor = tvBlogAuthor.getText().toString();
Intent intent = new Intent();
intent.setClass(BlogListView.this, AuthorBlogActivity.class);
Bundle bundle = new Bundle();
bundle.putString("author", userName);// �û���
bundle.putString("blogName", blogAuthor);// ���ͱ���
intent.putExtras(bundle);
startActivity(intent);
}
/**
* ����
*
* @param v
*/
private void ShareTo(View v) {
TextView tvBlogTitle = (TextView) (v
.findViewById(R.id.recommend_text_title));
String blogTitle = tvBlogTitle.getText().toString();
TextView tvBlogAuthor = (TextView) (v
.findViewById(R.id.recommend_text_author));
String blogAuthor = tvBlogAuthor.getText().toString();
TextView tvBlogUrl = (TextView) (v
.findViewById(R.id.recommend_text_url));
String blogUrl = tvBlogUrl.getText().toString();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "��ѡ�������");
String shareContent = "��" + blogTitle + "��,���ߣ�" + blogAuthor + "��ԭ�����ӣ�"
+ blogUrl + " �����ԣ�" + res.getString(R.string.app_name)
+ "Android�ͻ���(" + res.getString(R.string.app_homepage) + ")";
intent.putExtra(Intent.EXTRA_TEXT, shareContent);
startActivity(Intent.createChooser(intent, blogTitle));
}
// �����˵���Ӧ����
@Override
public boolean onContextItemSelected(MenuItem item) {
int itemIndex = item.getItemId();
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
View v = menuInfo.targetView;
switch (itemIndex) {
case R.id.menu_blog_view:// ��ϸ
RedirectDetailActivity(v);
break;
case R.id.menu_blog_comment:// ����
RedirectCommentActivity(v);
break;
case R.id.menu_blog_author:// �����������
RedirectAuthorActivity(v);
break;
case R.id.menu_blog_browser:// ��������в鿴
ViewInBrowser(v);
break;
case R.id.menu_blog_share:// ����
ShareTo(v);
break;
}
return super.onContextItemSelected(item);
}
/**
* ����ListViewΪ�Ѷ�״̬ �˹㲥ͬʱ��BlogDeatail��DownloadServices
*
* @author walkingp
*
*/
public class UpdateListViewReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context content, Intent intent) {
Bundle bundle = intent.getExtras();
int[] blogIdArr = bundle.getIntArray("blogIdArray");
for (int i = 0, len = mListView.getChildCount(); i < len; i++) {
View view = mListView.getChildAt(i);
TextView tvId = (TextView) view
.findViewById(R.id.recommend_text_id);
if (tvId != null) {
/*
* int blogId=Integer.parseInt(tvId.getText().toString());
*
* ImageView
* icoDown=(ImageView)view.findViewById(R.id.icon_downloaded
* ); TextView
* tvTitle=(TextView)view.findViewById(R.id.recommend_text_title
* );
*
* for(int j=0,size=blogIdArr.length;j<size;j++){
* if(blogId==blogIdArr[j]){
* icoDown.setVisibility(View.VISIBLE);//�Ѿ�����
* tvTitle.setTextColor(R.color.gray);//�Ѷ� } }
*/
}
}
for (int i = 0, len = blogIdArr.length; i < len; i++) {
for (int j = 0, size = listBlog.size(); j < size; j++) {
if (blogIdArr[i] == listBlog.get(j).GetBlogId()) {
listBlog.get(i).SetIsFullText(true);
listBlog.get(i).SetIsReaded(true);
}
}
}
}
}
}