Android應用開發-小巫CSDN部落格用戶端之擷取評論列表

來源:互聯網
上載者:User

標籤:android應用   csdn部落格   

Android應用開發-小巫CSDN部落格用戶端之擷取評論列表
上一篇部落格介紹了博文詳細內容的商務邏輯實現,本篇部落格介紹小巫CSDN部落格用戶端的最後一項功能,擷取評論列表,這個功能的實現跟前面擷取文章列表和文章詳細的內容不一樣,CSDN部落格擷取評論是通過js來請求伺服器載入評論列表的,返回資料為json資料,我們這裡要做的事情就是找到這樣的一個js檔案,再找到請求url的拼接字串,然後根據我們的需求,請求文章的評論列表擷取到當前文章的評論json資料,然後進行解析工作,最後展示到我們的介面當中。如果沒有仔細分析html代碼的童鞋,可能發現不了這一點,小巫在開發這個用戶端的時候,一時也擷取不到評論列表,後來通過與CSDN技術的交流之後,我再仔細查看才找到了關於部落格的請求方式,這裡使用jsoup無法類比javascript的載入,所以只能通過自己查看js代碼,找到請求的url,下面筆者會告訴大家怎麼來做這件事。
小巫這裡找一篇有評論的博文,比如以下這篇:http://blog.csdn.net/wwj_748/article/details/39726051

我們可以看到這篇文章的底部是我們的文章評論列表,有別人評論的也有自己回複的。用同樣的方式,F12查看原始碼,或者查看元素定位到評論內容,如下所示:


這時我們點擊進去查看相應的js檔案,去看看能不能找到我們想要的東西:
哎呀,很不小心就被我發現了我想要的東西:

從上面我們可以分析出,擷取文章的評論列表需要請求類似以下的地址:"http://blog.csdn.net/wwj_748/comment/list/39726051?page=1,剛開始小巫並不知道這樣的請求地址,是通過以上的方式才得知的。我們請求一篇文章需要知道對應文章的filename和pageIndex,然後以下面這種形式拼接:
/** * 返回博文評論列錶鏈接 *  * @param filename *            檔案名稱 * @param pageIndex *            頁數 * @return */public static String getCommentListURL(String filename, String pageIndex) {return "http://blog.csdn.net/wwj_748/comment/list/" + filename+ "?page=" + pageIndex;}

到了這一步基本上解決了最麻煩的事情,下面是商務邏輯的實現:/BlogClient/src/com/xiaowu/blogclient/BlogCommentActivity.java
package com.xiaowu.blogclient;import java.util.List;import me.maxwin.view.IXListViewLoadMore;import me.maxwin.view.IXListViewRefreshListener;import me.maxwin.view.XListView;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;import com.xiaowu.blogclient.adapter.CommentAdapter;import com.xiaowu.blogclient.model.Comment;import com.xiaowu.blogclient.model.Page;import com.xiaowu.blogclient.util.Constants;import com.xiaowu.blogclient.util.DateUtil;import com.xiaowu.blogclient.util.HttpUtil;import com.xiaowu.blogclient.util.JsoupUtil;import com.xiaowu.blogclient.util.URLUtil;/** * 2014/8/13 *  * 部落格評論列表 *  * @author wwj_748 *  */public class BlogCommentActivity extends Activity implementsIXListViewRefreshListener, IXListViewLoadMore {private XListView listView;private CommentAdapter adapter;private ProgressBar progressBar;private ImageView reLoadImageView;private ImageView backBtn;private TextView commentTV;public static String commentCount = "";private Page page;private String filename;private int pageIndex = 1;private int pageSize = 20;@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_comment);init();initComponent();listView.setRefreshTime(DateUtil.getDate()); // 設定重新整理時間listView.startRefresh(); // 開始重新整理}// 初始化private void init() {filename = getIntent().getExtras().getString("filename"); // 獲得檔案名稱page = new Page();adapter = new CommentAdapter(this);}// 初始化組件private void initComponent() {progressBar = (ProgressBar) findViewById(R.id.newsContentPro);reLoadImageView = (ImageView) findViewById(R.id.reLoadImage);reLoadImageView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("click");reLoadImageView.setVisibility(View.INVISIBLE);progressBar.setVisibility(View.VISIBLE);new MainTask().execute(Constants.DEF_TASK_TYPE.REFRESH);}});backBtn = (ImageView) findViewById(R.id.backBtn);backBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {finish();}});commentTV = (TextView) findViewById(R.id.comment);listView = (XListView) findViewById(R.id.listview);listView.setAdapter(adapter);listView.setPullRefreshEnable(this);listView.setPullLoadEnable(this);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {}});}@Overridepublic void finish() {super.finish();// 退齣動畫overridePendingTransition(R.anim.push_no, R.anim.push_right_out);}private class MainTask extends AsyncTask<String, Void, Integer> {@Overrideprotected Integer doInBackground(String... params) {// 獲得返回json字串String temp = HttpUtil.httpGet(URLUtil.getCommentListURL(filename,page.getCurrentPage()));if (temp == null) {return Constants.DEF_RESULT_CODE.ERROR;}// 獲得評論列表List<Comment> list = JsoupUtil.getBlogCommentList(temp,Integer.valueOf(page.getCurrentPage()), pageSize);if (list.size() == 0) {return Constants.DEF_RESULT_CODE.NO_DATA;}if (params[0].equals(Constants.DEF_TASK_TYPE.LOAD)) {adapter.addList(list);return Constants.DEF_RESULT_CODE.LOAD;} else {adapter.setList(list);return Constants.DEF_RESULT_CODE.REFRESH;}}@Overrideprotected void onPostExecute(Integer result) {if (result == Constants.DEF_RESULT_CODE.ERROR) {Toast.makeText(getApplicationContext(), "網路訊號不佳",Toast.LENGTH_SHORT).show();listView.stopRefresh(DateUtil.getDate());listView.stopLoadMore();reLoadImageView.setVisibility(View.VISIBLE);} else if (result == Constants.DEF_RESULT_CODE.NO_DATA) {Toast.makeText(getApplicationContext(), "無更多評論",Toast.LENGTH_SHORT).show();listView.stopLoadMore();listView.stopRefresh(DateUtil.getDate());commentTV.setText("共有評論:" + commentCount);} else if (result == Constants.DEF_RESULT_CODE.LOAD) {page.addPage();pageIndex++;adapter.notifyDataSetChanged();listView.stopLoadMore();} else if (result == Constants.DEF_RESULT_CODE.REFRESH) {adapter.notifyDataSetChanged();listView.stopRefresh(DateUtil.getDate());page.setPage(2);commentTV.setText("共有評論:" + commentCount); // 顯示評論數}progressBar.setVisibility(View.INVISIBLE);super.onPostExecute(result);}}// 載入更多@Overridepublic void onLoadMore() {new MainTask().execute(Constants.DEF_TASK_TYPE.LOAD);}// 重新整理評論@Overridepublic void onRefresh() {page.setPage(1);new MainTask().execute(Constants.DEF_TASK_TYPE.REFRESH);}}

/BlogClient/src/com/xiaowu/blogclient/adapter/CommentAdapter.java
package com.xiaowu.blogclient.adapter;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.graphics.Bitmap;import android.text.Html;import android.text.SpannableStringBuilder;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.ImageScaleType;import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;import com.xiaowu.blogclient.R;import com.xiaowu.blogclient.model.Comment;import com.xiaowu.blogclient.util.Constants;/** * 評論列表適配器 *  * @author wwj_748 *  */public class CommentAdapter extends BaseAdapter {private ViewHolder holder;private LayoutInflater layoutInflater;private Context context;private List<Comment> list;private SpannableStringBuilder htmlSpannable;private ImageLoader imageLoader = ImageLoader.getInstance();private DisplayImageOptions options;private String replyText;public CommentAdapter(Context c) {super();layoutInflater = (LayoutInflater) LayoutInflater.from(c);list = new ArrayList<Comment>();imageLoader.init(ImageLoaderConfiguration.createDefault(c));options = new DisplayImageOptions.Builder().showStubImage(R.drawable.csdn).showImageForEmptyUri(R.drawable.csdn).showImageOnFail(R.drawable.csdn).cacheInMemory().cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY).bitmapConfig(Bitmap.Config.RGB_565).displayer(new FadeInBitmapDisplayer(300)).build();}public void setList(List<Comment> list) {this.list = list;}public void addList(List<Comment> list) {this.list.addAll(list);}public void clearList() {this.list.clear();}public List<Comment> getList() {return list;}public void removeItem(int position) {if (list.size() > 0) {list.remove(position);}}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Comment item = list.get(position); // 擷取評論項if (null == convertView) {holder = new ViewHolder();switch (item.getType()) {case Constants.DEF_COMMENT_TYPE.PARENT: // 父項convertView = layoutInflater.inflate(R.layout.comment_item,null);holder.name = (TextView) convertView.findViewById(R.id.name);holder.content = (TextView) convertView.findViewById(R.id.content);holder.date = (TextView) convertView.findViewById(R.id.date);holder.reply = (TextView) convertView.findViewById(R.id.replyCount);holder.userface = (ImageView) convertView.findViewById(R.id.userface);break;case Constants.DEF_COMMENT_TYPE.CHILD: // 子項convertView = layoutInflater.inflate(R.layout.comment_child_item, null);holder.name = (TextView) convertView.findViewById(R.id.name);holder.content = (TextView) convertView.findViewById(R.id.content);holder.date = (TextView) convertView.findViewById(R.id.date);break;}convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (null != item) {switch (item.getType()) {case Constants.DEF_COMMENT_TYPE.PARENT: // 主題項holder.name.setText(item.getUsername()); holder.content.setText(Html.fromHtml(item.getContent())); // 顯示評論內容holder.date.setText(item.getPostTime());//holder.reply.setText(item.getReplyCount());imageLoader.displayImage(item.getUserface(), holder.userface, options);// 顯示頭像break;case Constants.DEF_COMMENT_TYPE.CHILD: // 回複項holder.name.setText(item.getUsername());replyText = item.getContent().replace("[reply]", "【");replyText = replyText.replace("[/reply]", "】");holder.content.setText(Html.fromHtml(replyText));holder.date.setText(item.getPostTime());break;default:break;}}return convertView;}@Overridepublic int getViewTypeCount() {return 2;}@Overridepublic int getItemViewType(int position) {switch (list.get(position).getType()) {case Constants.DEF_COMMENT_TYPE.PARENT: // 父節點return 0;case Constants.DEF_COMMENT_TYPE.CHILD: // 子節點return 1;}return 1;}@Overridepublic boolean isEnabled(int position) {return true;}private class ViewHolder {TextView id;TextView date;TextView name;TextView content;ImageView userface;TextView reply;}}


最終如下:

最後:關於小巫CSDN部落格用戶端的開發基本上都介紹完了,更多詳細的實現請到以下連結下載源碼查看:http://download.csdn.net/detail/wwj_748/7912513

Android應用開發-小巫CSDN部落格用戶端之擷取評論列表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.