CSDN客户端实现

本文主要讲解实现了一个CSDN的安卓客户端,主要知识点如下

  1. java爬虫获取网页数据
  2. 将java程序打包成jar包
  3. Fragment+viewpager+TabPageIndicator实现Tab效果
  4. gestureImageView实现放大缩小图片
  5. imageLodar实现异步加载图上
  6. XListView实现下拉刷新

java爬虫获取网页资源

package com.zhy.biz;  import java.util.ArrayList;  
import java.util.List;  import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;  
import org.jsoup.select.Elements;  import com.zhy.bean.CommonException;  
import com.zhy.bean.NewsItem;  
import com.zhy.csdn.DataUtil;  
import com.zhy.csdn.URLUtil;  /** * 处理NewItem的业务类 * @author zhy *  */  
public class NewsItemBiz  
{  /** * 业界、移动、云计算 *  * @param htmlStr * @return * @throws CommonException  */  public List<NewsItem> getNewsItems( int newsType , int currentPage) throws CommonException  {  String urlStr = URLUtil.generateUrl(newsType, currentPage);  String htmlStr = DataUtil.doGet(urlStr);  List<NewsItem> newsItems = new ArrayList<NewsItem>();  NewsItem newsItem = null;  Document doc = Jsoup.parse(htmlStr);  Elements units = doc.getElementsByClass("unit");  for (int i = 0; i < units.size(); i++)  {  newsItem = new NewsItem();  newsItem.setNewsType(newsType);  Element unit_ele = units.get(i);  Element h1_ele = unit_ele.getElementsByTag("h1").get(0);  Element h1_a_ele = h1_ele.child(0);  String title = h1_a_ele.text();  String href = h1_a_ele.attr("href");  newsItem.setLink(href);  newsItem.setTitle(title);  Element h4_ele = unit_ele.getElementsByTag("h4").get(0);  Element ago_ele = h4_ele.getElementsByClass("ago").get(0);  String date = ago_ele.text();  newsItem.setDate(date);  Element dl_ele = unit_ele.getElementsByTag("dl").get(0);// dl  Element dt_ele = dl_ele.child(0);// dt  try  {// 可能没有图片  Element img_ele = dt_ele.child(0);  String imgLink = img_ele.child(0).attr("src");  newsItem.setImgLink(imgLink);  } catch (IndexOutOfBoundsException e)  {  }  Element content_ele = dl_ele.child(1);// dd  String content = content_ele.text();  newsItem.setContent(content);  newsItems.add(newsItem);  }  return newsItems;  }  }  

详细实现参见链接

抓取csdn上的各类别的文章 (制作csdn app 二) - Hongyang - 博客频道 - CSDN.NET

将java项目打包成jar包

参考链接:在Eclipse中将Java项目打包为jar - 闵开慧的个人页面 - 开源中国社区

Fragment+viewpager+TabPageIndicator实现Tab效果

package com.zhy.csdndemo;  import com.viewpagerindicator.TabPageIndicator;  import android.os.Bundle;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.app.FragmentPagerAdapter;  
import android.support.v4.view.ViewPager;  public class MainActivity extends FragmentActivity  
{  private TabPageIndicator mIndicator ;  private ViewPager mViewPager ;  private FragmentPagerAdapter mAdapter ;  @Override  protected void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  mIndicator = (TabPageIndicator) findViewById(R.id.id_indicator);  mViewPager = (ViewPager) findViewById(R.id.id_pager);  mAdapter = new TabAdapter(getSupportFragmentManager());  mViewPager.setAdapter(mAdapter);  mIndicator.setViewPager(mViewPager, 0);  }  }  

详细实现参见链接

Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架 - Hongyang - 博客频道 - CSDN.NET

viewPager的适配器

package com.zhy.csdndemo;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;public class TabAdapter extends FragmentPagerAdapter
{public static final String[] TITLES = new String[] { "业界", "移动", "研发", "程序员杂志", "云计算" };public TabAdapter(FragmentManager fm){super(fm);}@Overridepublic Fragment getItem(int arg0){MainFragment fragment = new MainFragment(arg0+1);return fragment;}@Overridepublic CharSequence getPageTitle(int position){return TITLES[position % TITLES.length];}@Overridepublic int getCount(){return TITLES.length;}}

viewPager中的Fragment实现,其中用xListView实现了获取数据与刷新等功能

package com.zhy.csdndemo;import java.util.ArrayList;
import java.util.List;import me.maxwin.view.IXListViewLoadMore;
import me.maxwin.view.IXListViewRefreshListener;
import me.maxwin.view.XListView;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.zhy.bean.CommonException;
import com.zhy.bean.NewsItem;
import com.zhy.biz.NewsItemBiz;
import com.zhy.csdn.Constaint;
import com.zhy.csdndemo.adapter.NewsItemAdapter;@SuppressLint("ValidFragment")
public class MainFragment extends Fragment implements IXListViewRefreshListener, IXListViewLoadMore
{/*** 默认的newType*/private int newsType = Constaint.NEWS_TYPE_YEJIE;/*** 当前页面*/private int currentPage = 1;/*** 处理新闻的业务类*/private NewsItemBiz mNewsItemBiz;/*** 扩展的ListView*/private XListView mXListView;/*** 数据适配器*/private NewsItemAdapter mAdapter;/*** 数据*/private List<NewsItem> mDatas = new ArrayList<NewsItem>();/*** 获得newType* @param newsType*/public MainFragment(int newsType){this.newsType = newsType;mNewsItemBiz = new NewsItemBiz();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){return inflater.inflate(R.layout.tab_item_fragment_main, null);}@Overridepublic void onActivityCreated(Bundle savedInstanceState){super.onActivityCreated(savedInstanceState);mAdapter = new NewsItemAdapter(getActivity(), mDatas);/*** 初始化*/mXListView = (XListView) getView().findViewById(R.id.id_xlistView);mXListView.setAdapter(mAdapter);mXListView.setPullRefreshEnable(this);mXListView.setPullLoadEnable(this);//mXListView.NotRefreshAtBegin();/*** 进来时直接刷新*/mXListView.startRefresh();}@Overridepublic void onRefresh(){new LoadDatasTask().execute();}@Overridepublic void onLoadMore(){// TODO Auto-generated method stub}/*** 记载数据的异步任务* @author zhy**/class LoadDatasTask extends AsyncTask<Void, Void, Void>{@Overrideprotected Void doInBackground(Void... params){try{List<NewsItem> newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);mDatas = newsItems;} catch (CommonException e){// TODO Auto-generated catch blocke.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Void result){mAdapter.addAll(mDatas);mAdapter.notifyDataSetChanged();mXListView.stopRefresh();}}}

xListView的adapter,其中使用了imageLoder

package com.zhy.csdndemo.adapter;import java.util.List;import android.content.Context;
import android.util.Log;
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.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.zhy.bean.NewsItem;
import com.zhy.csdn.DataUtil;
import com.zhy.csdndemo.R;public class NewsItemAdapter extends BaseAdapter
{private LayoutInflater mInflater;private List<NewsItem> mDatas;/*** 使用了github开源的ImageLoad进行了数据加载*/private ImageLoader imageLoader = ImageLoader.getInstance();private DisplayImageOptions options;public NewsItemAdapter(Context context, List<NewsItem> datas){this.mDatas = datas;mInflater = LayoutInflater.from(context);imageLoader.init(ImageLoaderConfiguration.createDefault(context));options = new DisplayImageOptions.Builder().showStubImage(R.drawable.images).showImageForEmptyUri(R.drawable.images).showImageOnFail(R.drawable.images).cacheInMemory().cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).displayer(new FadeInBitmapDisplayer(300)).build();}public void addAll(List<NewsItem> mDatas){this.mDatas.addAll(mDatas);}@Overridepublic int getCount(){return mDatas.size();}@Overridepublic Object getItem(int position){return mDatas.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){ViewHolder holder = null;if (convertView == null){convertView = mInflater.inflate(R.layout.news_item_yidong, null);holder = new ViewHolder();holder.mContent = (TextView) convertView.findViewById(R.id.id_content);holder.mTitle = (TextView) convertView.findViewById(R.id.id_title);holder.mDate = (TextView) convertView.findViewById(R.id.id_date);holder.mImg = (ImageView) convertView.findViewById(R.id.id_newsImg);convertView.setTag(holder);} else{holder = (ViewHolder) convertView.getTag();}NewsItem newsItem = mDatas.get(position);holder.mTitle.setText(DataUtil.ToDBC(newsItem.getTitle()));holder.mContent.setText(newsItem.getContent());holder.mDate.setText(newsItem.getDate());if (newsItem.getImgLink() != null){holder.mImg.setVisibility(View.VISIBLE);imageLoader.displayImage(newsItem.getImgLink(), holder.mImg, options);} else{holder.mImg.setVisibility(View.GONE);}return convertView;}private final class ViewHolder{TextView mTitle;TextView mContent;ImageView mImg;TextView mDate;}}

参考链接:

客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三) - Hongyang - 博客频道 - CSDN.NET

效果如下

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抓住金三银四的尾巴,解锁程序员面试《刷题神器》

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 刷题 不仅能掌握知识&#xff0c;快速学习进步。 更能轻松搞定面试&#xff0c;尤其是有的大厂 钟爱问算法题&#xff0c;你不刷就不会&#xff0c;就会被pass。同时&#xff0c;刷题能陶冶情操&#xff0c;避免老年痴呆 &#x1f60b; …

腾讯AI Lab开源世界首款自动化模型压缩框架PocketFlow:将深度学习装进口袋

来源&#xff1a;腾讯AI 实验室腾讯AI Lab机器学习中心今日宣布成功研发出世界上首款自动化深度学习模型压缩框架——PocketFlow&#xff0c;并即将在近期发布开源代码。这是一款面向移动端AI开发者的自动模型压缩框架&#xff0c;集成了当前主流&#xff08;包括腾讯AI Lab自研…

【拿走不谢】大数据高效查询神器--bitmap

背景 在hive中使用Roaring64Bitmap实现精确去重功能 主要目的&#xff1a; 提升 hive 中精确去重性能&#xff0c;代替hive 中的 count(distinct uuid)&#xff1b;节省 hive 存储 &#xff0c;使用 bitmap 对数据压缩 &#xff0c;减少了存储成本&#xff1b;提供在 hive 中…

Android之智能问答机器人

本文主要利用图灵机器人的接口&#xff0c;所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView&#xff0c;所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml version"1.0" encoding"utf-8"?> <LinearLa…

5张图告诉你:同样是职场人,差距怎么这么大?

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 在职场中&#xff0c;我们常常会听到各种各样的抱怨&#xff1a; &#x1f469;‍⚖️‍ 小A: 凭什么别人每次述职绩效都是优秀呀&#xff1f; 感觉TA也没干啥呀! &#x1f575; 小B: 凭啥这个事情&#xff0c;领导指派TA去对接呀&#…

史上最强阵容,BAT大佬携手AI顶级大咖齐聚上海话AI

来源&#xff1a;网易智能9月17日上午&#xff0c;齐聚各路大佬的2018世界人工智能大会在上海西岸艺术中心开幕。不得不说&#xff0c;这次大会的嘉宾阵容&#xff0c;为中国科技界史上最强&#xff0c;没有之一。今天主论坛亮相会议并发表演讲的大咖&#xff0c;除了聚集了BAT…

没错,列式存储非常牛。但是,Ta还可以更高效

很多数据仓库产品都采用了列式存储。如果数据表的总列数很多而计算涉及的列很少&#xff0c;采用列存就只读取需要的列即可&#xff0c;能够减少硬盘访问量&#xff0c;提高性能。 特别是数据量非常大时&#xff0c;硬盘扫描和读取的时间占比很大&#xff0c;这时候列存的优势…

Android实现电子邮箱客户端

本文主要讲述了安卓平台上利用QQ邮箱SMTP协议&#xff0c;POP3协议发送与接收消息的实现 发送邮件核心代码 import java.security.Security; import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; …

谷歌AI涉足艺术、太空、外科手术,再强调AI七原则

来源&#xff1a;网易智能9月18日上午&#xff0c;Google在上海的2018世界AI 大会上举办了一场名为“AI触手可及”的主题论坛。在论坛上&#xff0c;Google全球副总裁、工程研究员Jay Yagnik 携Google 不同领域的研究者发表了演讲&#xff0c;重点阐述了Google AI在自家产品上的…

单个手指的手势识别

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; 本文把Aforge的运动识别与前面介绍的手写识别融合在一起&#xff0c;实现单个手指的手势识别。下图演示了本文代码运行的结果&#xff0c;图片有点大&#xff0c;请稍候。。。 我预先让程序学…

Apifox:满足你对 Api 的所有幻想

文章目录⌚️ 一、Api 管理的难点在哪&#xff1f;&#x1f4f1; 二、Apifox 是什么&#xff1f;&#x1f4bf; 三、接口设计 (接口文档)⌨️ 3.1 接口文档&#x1f4bb; 3.2 快速上手&#x1f5a8; 3.3 接口路径&#x1f4bd; 四、团队管理&#x1f4fd; 4.1 权限管理⏱ 4.2 项…

百度地图综合

本文主要包括百度地图API的综合应用&#xff0c;主要内容如下 地图图层展示&#xff0c;包括热力图与实时路况图 添加覆盖物&#xff0c;包括图片&#xff0c;文字&#xff0c;折线等地图控制&#xff0c;包括俯视&#xff0c;旋转&#xff0c;放大&#xff0c;缩小等定位&…

国内Api行业,可以内卷到什么程度?

随着移动应用以及智能设备爆发增长&#xff0c;同时越来越多的零售商、媒体、政府和金融服务公司开始公开Web API&#xff0c;API的使用越来越多。 现在&#xff0c;每日API调用量在不断飙升&#xff0c;早在2009年&#xff0c;Facebook每天API调用量就已经达到了50亿。如何能…

自动驾驶关键技术报告:惯性导航和背后的芯片大战

来源&#xff1a;智东西摘要&#xff1a;惯性导航将成为自动驾驶定位信息融合的中心。惯性导航系统由于具有的输出信息不间断、不受外界干扰的独特优势&#xff1b;同时可以将多种传感器的信息以及车身信息进行更深层次的融合&#xff0c;为决策层提供精确可靠的连续的车辆位置…

3D打印产业化机遇与挑战

来源&#xff1a;3D科学谷3D打印的突出特点有两个&#xff1a;免除模具以及制造成本对设计的复杂性不敏感。免除模具的特点使得3D打印适合用于产品原型、试制零件、备品备件、个性化定制、零件修复、医疗植入物、医疗导板、牙科产品、耳机产品等小批量个性化的产品。而传统制造…

Android之ExpandableListView

ExpandableListView可以用来表现多层级的listView&#xff0c;本文主要是ExpandableListView的一个简单实现 布局文件 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"andro…

Api -- 连接世界的Super Star

文章目录&#x1f34f; 一、api 的定义&#xff1a;数据共享模式定义 4 大种类&#x1f356; 二、api 使用场景&#xff1a;互联网时代&#xff0c;api 无处不在2.1 sql 查询2.2 数据传输&#x1f364; 三、开放 api&#xff08;OpenAPI&#xff09;&#xff1a;开放双赢&#…

2018全球最强物联网公司揭晓!

来源&#xff1a;数字化企业根据Gartner预测&#xff0c; 到2020年将有超过200亿台联网设备&#xff0c;市场价值将达3000亿美元之巨。随着垂直应用上的不断细分&#xff0c;以及与AI的加速整合&#xff0c;物联网不仅将持续地变革人们的生活和工作&#xff0c;市场规模也将持续…

Android之解析GML并显示

本例主要实现在APP中解析GML数据并显示 GML,地理标记语言&#xff08;外语全称&#xff1a;Geography MarkupLanguage、外语缩写&#xff1a;GML&#xff09;&#xff0c;它由开放式地理信息系统协会&#xff08;外语缩写&#xff1a;OGC&#xff09;于1999年提出&#xff0c;…

中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》...

来源&#xff1a;中国电子学会当前&#xff0c;全球正在经历科技和产业高度耦合、深度迭加的新一轮变革&#xff0c;大数据的形成、理论算法的革新、计算能力的提升及网络设施的演进驱动人工智能进入新一轮创新发展高峰期&#xff0c;新技术持续获得突破性进展&#xff0c;呈现…