package com.cnblogs.android; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; 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.AuthorBlogListAdapter; import com.cnblogs.android.cache.AsyncImageLoader; import com.cnblogs.android.cache.ImageCacher; import com.cnblogs.android.cache.AsyncImageLoader.ImageCallback; 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.core.UserHelper; import com.cnblogs.android.dal.BlogDBHelp; import com.cnblogs.android.dal.RssListDalHelper; import com.cnblogs.android.entity.Blog; import com.cnblogs.android.entity.RssList; import com.cnblogs.android.entity.Users; import com.cnblogs.android.services.DownloadServices; import com.cnblogs.android.ui.tab1.BlogDetailView; import com.cnblogs.android.utility.NetHelper; /** * ��ҳ�������ߵIJ���ҳ * @author walkingp * @date:2011-11 * */ public class AuthorBlogActivity extends SuperView{ List<Blog> listBlog = new ArrayList<Blog>(); private AsyncImageLoader asyncImageLoader; AuthorBlogListAdapter adapter; int pageIndex=1;//ҳ�� ListView listView; ProgressBar blogBody_progressBar;//���� ImageButton blog_refresh_btn;//ˢ�°�ť private Button blog_button_back;//���� ProgressBar blog_progress_bar;//���ذ�ť private LinearLayout viewFooter;//footer view TextView tvFooterMore;//�ײ�������ʾ ProgressBar list_footer_progress;//�ײ������� private String author;//�����û��� private String blogName;//������ private int blogCount;//�������� Button btn_rss;//���İ�ť private int lastItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.author_blog_layout); InitialControls(); BindEvent(); new PageTask(0,true).execute(); } /** * ���¼� */ private void BindEvent(){ //ˢ�� blog_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) { Intent intent = new Intent(); try{ //���ݲ��� intent.setClass(AuthorBlogActivity.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)); 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(); 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); Log.d("blogId", String.valueOf(blogId)); intent.putExtras(bundle); startActivityForResult(intent, 0); }catch(Exception ex){ ex.printStackTrace(); } } }); } /** * ��ʼ���б� */ private void InitialControls(){ //���ݹ�����ֵ author=getIntent().getStringExtra("author");//���� blogName=getIntent().getStringExtra("blogName");//������ listView = (ListView) findViewById(R.id.author_blog_list); blogBody_progressBar=(ProgressBar)findViewById(R.id.author_blogList_progressBar); blogBody_progressBar.setVisibility(View.VISIBLE); //ˢ�� blog_refresh_btn=(ImageButton)findViewById(R.id.author_blog_refresh_btn); blog_progress_bar=(ProgressBar)findViewById(R.id.author_blog_progressBar); //���� blog_button_back=(Button)findViewById(R.id.author_blog_button_back); blog_button_back.setOnClickListener(new OnClickListener(){ public void onClick(View v) { AuthorBlogActivity.this.finish(); } }); //�ײ�view LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); viewFooter = (LinearLayout)mInflater.inflate(R.layout.listview_footer, null, false); //����û����� final Users entity=UserHelper.GetUserDetail(author); if(entity==null){ Toast.makeText(getApplicationContext(), R.string.sys_no_author, Toast.LENGTH_SHORT).show(); return; } //���� TextView txtAuthorName=(TextView)findViewById(R.id.author_name); txtAuthorName.setText(blogName); //���͵�ַ TextView txtAuthorUrl=(TextView)findViewById(R.id.author_url); final String url=entity.GetBlogUrl(); txtAuthorUrl.setText(url); txtAuthorUrl.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Uri blogUri=Uri.parse(url); Intent it = new Intent(Intent.ACTION_VIEW, blogUri); startActivity(it); } }); //�������� blogCount=entity.GetBlogCount(); TextView txtBlogCount=(TextView)findViewById(R.id.author_blog_count); txtBlogCount.setText("(����" + blogCount + "ƪ���)"); //ͷ�� final ImageView imgAvatar=(ImageView)findViewById(R.id.author_image_icon); asyncImageLoader = new AsyncImageLoader(getApplicationContext()); String tag = entity.GetAvator(); if(tag!=null){ if (tag.contains("?")) {// �ض�?����ַ�����������ЧͼƬ tag = tag.substring(0, tag.indexOf("?")); } Drawable cachedImage = asyncImageLoader.loadDrawable( ImageCacher.EnumImageType.Avatar, tag, new ImageCallback() { public void imageLoaded(Drawable imageDrawable, String tag) { if (imageDrawable != null) { imgAvatar.setImageDrawable(imageDrawable); } else { try { imgAvatar.setImageResource(R.drawable.sample_face); } catch (Exception ex) { } } } }); if (cachedImage != null) { imgAvatar.setImageDrawable(cachedImage); } } // �Ƿ��Ѿ����� btn_rss=(Button)findViewById(R.id.btn_rss); RssListDalHelper helper = new RssListDalHelper(this); final boolean isRssed = helper.ExistByAuthorName(author); btn_rss.setTag(isRssed); final Users userEntity=entity; OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { // ���� ȡ������ String url = entity.GetBlogUrl(); RssList entity = new RssList(); // entity.SetAddTime(new java.util.Date()); entity.SetAuthor(author);//ע��˴����û��������Dz����� entity.SetCateId(0); entity.SetCateName(""); entity.SetDescription(userEntity.GetBlogUrl()); entity.SetGuid(String.valueOf(userEntity.GetUserId())); entity.SetImage(userEntity.GetAvator()); entity.SetIsActive(true); entity.SetIsCnblogs(true); entity.SetLink(url); entity.SetOrderNum(0); entity.SetTitle(blogName); // �㲥 Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putStringArray("rsslist", new String[]{entity.GetAuthor(),entity.GetDescription(),entity.GetGuid(), entity.GetTitle(),entity.GetImage(),entity.GetLink(), entity.GetIsCnblogs() ? "1" : "0" }); RssListDalHelper helper = new RssListDalHelper(getApplicationContext()); boolean _isRssed =Boolean.parseBoolean(btn_rss.getTag().toString()); if (_isRssed) {// �˶� helper.Delete(entity.GetLink()); btn_rss.setBackgroundResource(R.drawable.drawable_btn_rss); btn_rss.setText(R.string.btn_rss); btn_rss.setTextColor(R.color.gray); btn_rss.setTag(false); bundle.putBoolean("isrss", false); Toast.makeText(getApplicationContext(), "�˶��ɹ�", Toast.LENGTH_SHORT) .show(); } else {// ���� helper.Insert(entity); btn_rss.setBackgroundResource(R.drawable.btn_rssed); btn_rss.setText(R.string.btn_unrss); btn_rss.setTextColor(R.color.darkblue); btn_rss.setTag(true); bundle.putBoolean("isrss", true); Toast.makeText(getApplicationContext(), "���ijɹ�", Toast.LENGTH_SHORT) .show(); } // ���͹㲥 intent.putExtras(bundle); intent.setAction("android.cnblogs.com.update_rsslist"); AuthorBlogActivity.this.sendBroadcast(intent); } }; btn_rss.setOnClickListener(listener); if (isRssed) { btn_rss.setBackgroundResource(R.drawable.btn_rssed); btn_rss.setText(R.string.btn_unrss); btn_rss.setTextColor(R.color.gray); } } /** * �˵� */ @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.author_blog_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.author_blog_offline://�������� if (!NetHelper.networkIsAvailable(getApplicationContext())) {// ���粻���� Toast.makeText(getApplicationContext(),R.string.sys_network_error,Toast.LENGTH_SHORT).show(); return false; } DownloadServices.EnumDataType dataType = DownloadServices.EnumDataType.AuthorBlog; Intent intent = new Intent(AuthorBlogActivity.this,DownloadServices.class); intent.putExtra("type", dataType.ordinal()); intent.putExtra("author", author); intent.putExtra("size", blogCount); Toast.makeText(getApplicationContext(),R.string.offline_notification_start_toast,Toast.LENGTH_SHORT).show(); startService(intent); break; } return super.onOptionsItemSelected(item); } /** * ���߳������������������ء���ʼ�������ؼ��ء�ˢ�£� * */ public class PageTask extends AsyncTask<String, Integer, List<Blog>> { boolean isRefresh=false; int curPageIndex=0; boolean isLocalData = false;// �Ƿ��Ǵӱ��ض�ȡ������ BlogDBHelp dbHelper = new BlogDBHelp(getApplicationContext()); public PageTask(int page,boolean isRefresh) { curPageIndex=page; this.isRefresh=isRefresh; } protected List<Blog> doInBackground(String... params) { boolean isNetworkAvailable = NetHelper.networkIsAvailable(getApplicationContext()); int _pageIndex=curPageIndex; if(_pageIndex<=0){ _pageIndex=1; } // ���ȶ�ȡ�������� List<Blog> listBlogLocal = dbHelper.GetBlogListByAuthor(author,_pageIndex,Config.BLOG_PAGE_SIZE); if (isNetworkAvailable) {// ��������� List<Blog> listBlogNew = BlogHelper.GetAuthorBlogList(author, _pageIndex); switch (curPageIndex) { 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 (curPageIndex == -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) 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); } if (curPageIndex == -1) {// ����ˢ�� adapter.InsertData(result); } else if (curPageIndex == 0) {// �״μ��� listBlog = result;// dbHelper.GetTopBlogList(); blogBody_progressBar.setVisibility(View.GONE); adapter = new AuthorBlogListAdapter(getApplicationContext(),listBlog); listView.setAdapter(adapter); // ���ݲ��� ((PullToRefreshListView) listView).SetDataRow(listBlog.size()); ((PullToRefreshListView) listView) .SetPageSize(Config.BLOG_PAGE_SIZE); } else if (curPageIndex == 1) {// ˢ�� try {// ������ҳ��������أ���ˢ�°�ť if (adapter != null && adapter.GetData() != null) { adapter.GetData().clear(); adapter.AddMoreData(result); } else if (result != null) { adapter = new AuthorBlogListAdapter(getApplicationContext(),result); listView.setAdapter(adapter); } blogBody_progressBar.setVisibility(View.GONE); } catch (Exception ex) { // Log.e("BlogActivity", ex.getMessage()); } } else {// ���� adapter.AddMoreData(result); } if (isRefresh) {// ˢ��ʱ���� ((PullToRefreshListView) listView).onRefreshComplete(); } } @Override protected void onPreExecute() { //��������� if(listView.getCount()==0){ blogBody_progressBar.setVisibility(View.VISIBLE); } //���Ͻ� blog_progress_bar.setVisibility(View.VISIBLE); blog_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) { } } }