新闻client案例开发

ljbguanli ljbguanli     2022-09-06     216

关键词:

  新闻client。顾名思义就是看新闻用的client。

  该新闻用到的知识模块有:android高级界面设计(FragmentViewPager),android网络通信(http通信)。开源组件(xutils框架-HttpUtils模块、xutils框架-BitmapUtils模块),开源框架(library)。

所需jar包:xUtilsgsonandroid-support-v4。

 主界面滑动标签:library框架用于主界面标签
?主界面ViewPagerViewPager与上部分的library框架结合做成Fragment动态效果
?ListView中的每一个Item
?
?
?HttpUtils模块进行是用于进行訪问网络,获取json数据
?BitmapUtils模块进行网络图片的载入和显示
?android-support-v4.jar包提供ViewPager控件
?library开源码框架库,是用来实现简易新闻client上端的滑动标签。同一时候它与ViewPager控件结合终于实现的是Fragment的动态实现。


?简易新闻client上端滑动标签是用了library开源码框架中的com.viewpagerindicator.TabPageIndicator控件
?ViewPager控件是android-support-v4.jar包中的android.support.v4.view.ViewPager控件。


?用了com.viewpagerindicator.TabPageIndicator这个控件之后,要对界面主题(Theme)进行改动。在styles.xml文件里创建相关的style


首先导入libary库:千万不要直接把库拷贝进项目目录中。这样可能会出现各种其它不知名的错误,建议通过Import Module方式一步步导入库文件。然后在file->project structure->dependencies->3Model dependency中选择library库就能够了,还要在2中导入一个gson.jar和xUtils.jar。

此时库已成功导入。


我们首先来写布局文件,activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
    >

    <include
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="@dimen/header_height"
        layout="@layout/header"/>

    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/indicator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/header">
    </com.viewpagerindicator.TabPageIndicator>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/indicator">
    </android.support.v4.view.ViewPager>
</RelativeLayout>


第2个是头部header.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/header_height"
    android:background="@mipmap/setting_iv_bg"
    android:gravity="center">

    <TextView
        android:text="@string/header_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/header_text_size"
        />
</RelativeLayout>

第三个是以下的viepage页面。fragment.xml

<?xml version="1.0" encoding="utf-8"?

> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/newsList" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </LinearLayout>


以及细节部分fragment_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    
    <ImageView 
        android:id="@+id/newIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:src="@mipmap/skyblue_logo_whatsapp_checked"/>
    
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/newIcon"
        >
        
        <TextView
        android:id="@+id/newTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/newTitleTxtSize"

        />
        <TextView 
            android:id="@+id/newTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/newTimeTxtSize"
            />
        
    </LinearLayout>

</RelativeLayout>

既然是一个新闻client那必需要有数据。那么数据当然就需要json解析来从第三方站点获取新闻数据,以下来简要介绍一下json数据的解析过程。

?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。

JSON採用全然独立于语言的文本格式。可是也使用了类似于C语言家族的习惯(包含C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同一时候也易于机器解析和生成(一般用于提升网络传输速率)。



这个时候我们须要在src中新建一个bean类来存放json的数据

public class jsonBean {
    private String title;
    private String url;
    private String listimage;
    private String pubdate;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getListimage() {
        return listimage;
    }
    public void setListimage(String listimage) {
        this.listimage = listimage;
    }
    public String getPubdate() {
        return pubdate;
    }
    public void setPubdate(String pubdate) {
        this.pubdate = pubdate;
    }
}

然后再bean中再创建一个ListBean.java,用于存取多个新闻的内容,这里面须要两个内部类,通过data获取NewsList,然后通过NewsLis获取到NewsItem中的值。

public class listBean {
    //变量名最好跟json中一样
    public NewsList data;

    public static class NewsList{
        //变量名最好跟json中一样
        public ArrayList<NewsItem> news;
    }

    public static class NewsItem{
        public String title;
        public String url;
        public String listimage;
        public String pubdate;
    }}

接下来就须要訪问网络了。新建一个utils包,再建一个NetUtils.java类

public class NetUtils {
      //定义我们须要的变量
      private HttpUtils httpUtils;
      //全局变量
      private Gson gson=new Gson();
      private List<News> newsList=new ArrayList<News>();

      private News news;

      //获取新闻信息
      public List<News> getNews(String url){
         //訪问网络是一个耗时操作。建议开启新线程
         GetNewsRunnable getNewsRunnable=new GetNewsRunnable(httpUtils, gson, newsList, news, url);
         getNewsRunnable.run();
         return newsList;
      }

      public void addAll(List<News> newsList){
         this.newsList.addAll(newsList);
      }
   }
新建一个GetNewsRunnable.java,请求网络。


public class GetNewsRunnable implements Runnable{

   private HttpUtils httpUtils;
   private Gson gson;
   private List<News> newsList;
   private News news;
   private String url;
   private NetUtils netUtils;

   public GetNewsRunnable(HttpUtils httpUtils,Gson gson,List<News> newsList,News news,String url){
      this.httpUtils=httpUtils;
      this.gson=gson;
      this.newsList=newsList;
      this.news=news;
      this.url=url;
      netUtils=new NetUtils();
   }

   //run方法中訪问网络并解析json数据
   public void run() {
      if(newsList==null){
         newsList=new ArrayList<News>();
      }
      httpUtils=new HttpUtils();

      httpUtils.send(HttpMethod.GET, url, new RequestCallBack<String>() {

         public void onFailure(HttpException arg0, String arg1) {
            Log.e("failure", "訪问失败");
         }

         public void onSuccess(ResponseInfo<String> responseInfo) {
            Log.e("success", "訪问成功");
            //訪问成功,就进行数据解析
            NewsListBean newsListBean=gson.fromJson(responseInfo.result, NewsListBean.class);
            //for-each循环
            for(NewsListBean.NewsItem newsItem:newsListBean.data.news){
               news=new News();
               news.setTitle(newsItem.title);
               news.setListimage(newsItem.listimage);
               news.setUrl(newsItem.url);
               news.setPubdate(newsItem.pubdate);
               newsList.add(news);
               netUtils.addAll(newsList);
            }
         }
      });
   }
}
好了。我们如今须要加入一个适配器了,4个构造方法getCount()、getItem、getItemId、getView能够自己主动生成就能够了,在适配器中我们首先把变量写好

//定义变量
private List<News> newsList;
private LayoutInflater mInflater;  //获取外部布局用的
private BitmapUtils mBitmapUtils;  //载入和显示图片用的
public NewsListAdapter(Context context,List<News> newsList){
    this.newsList=newsList;
    this.mInflater=LayoutInflater.from(context);
    mBitmapUtils=new BitmapUtils(context);
}


//真正存放东西的方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder=null;
    if(convertView==null){//假设传进来的view为空,就进行创建,并填充内容
        holder=new ViewHolder();
        convertView=mInflater.inflate(R.layout.fragment_list_item, null);
        holder.newIcon=(ImageView) convertView.findViewById(R.id.newIcon);
        holder.newTime=(TextView) convertView.findViewById(R.id.newTime);
        holder.newTitle=(TextView) convertView.findViewById(R.id.newTitle);
        convertView.setTag(holder);
    }else{
        holder=(ViewHolder) convertView.getTag();
    }
    //将数据放到我们的控件其中
    News news=newsList.get(position);
    holder.newTitle.setText(news.getTitle());
    holder.newTime.setText(news.getPubdate());
    mBitmapUtils.display(holder.newIcon, news.getListimage());
    return convertView;
}
//模拟我们传递的控件
class ViewHolder{
    ImageView newIcon;
    TextView newTitle;
    TextView newTime;
}

//把全部News加进List中
public void addListItem(List<News> list){
    newsList.addAll(list);

通过适配器将数据传送到listview中,之后我们要用到fragment,

//这里是ListView的滚动和点击事件
newsList.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                     long arg3) {
      // TODO Auto-generated method stub
      //获取新闻具体信息的地址
      String descriptionUrl=newsDatas.get(position).getUrl();
      //定义并实例化Intent
      Intent intent=new Intent(getActivity().getApplicationContext(),DescriptActivity.class);
      String name="url";
      //将值放到intent其中
      intent.putExtra(name, descriptionUrl);
      //开启Activity
      startActivity(intent);
   }
});
然后我们加入一些详情页TabIndicatorAdapter

最后描写叙述新闻详情

public class DescriptActivity extends Activity {


   private WebView newsDescription;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_descript);

      String url=this.getIntent().getExtras().get("url").toString();
      newsDescription=(WebView) findViewById(R.id.newsDescription);

      /**
       * 适配屏幕
       */
      newsDescription.getSettings().setUseWideViewPort(true);
      newsDescription.getSettings().setLoadWithOverviewMode(true);
      newsDescription.setVerticalScrollBarEnabled(true);
      newsDescription.setHorizontalScrollBarEnabled(false);
      newsDescription.loadUrl(url);

   }
}
记得在清单文件里加入网络权限等,另一些步骤就不一一细说了,详细的能够下载源代码看一下。

<uses-permission android:name="android.permission.INTERNET" />
终于效果图为:

技术分享点击打开链接

源代码下载地址:点击打开链接http://download.csdn.net/detail/sdksdk0/9446330   



























网易新闻client(高仿)

...曾经做过的项目,决定分享出来。本篇所展示的是仿网易新闻client,服务端是在新浪SAE部署着的。所以大家下载后,可直接在手机上看到效果。接下来看效果图:技术要点:每一个界面都是一个Fragment。通过ScrollVIew+ViewPaper+Listvie... 查看详情

聚合类新闻client初体验

初体验的产品:今日头条(ios3.6)、百度新闻(ios4.4.0)、ZAKER(ios4.4.5)、鲜果(ios3.8.7)、中搜搜悦(ios4.0.1)、Flipboard(ios2.3.9)1、Flipboard   一款国外非常火的app,UI以及体验都做得非常不错,非常多人都评论其不接地气,在我看来... 查看详情

网易新闻小案例

抓取网易新闻的接口,用代理服务器解决跨域,在前端页面上展示。需要的文件有:index.html,app.js,headLine.html,headlineController.js,detail.html,detailController.js,引入js文件:angular.js和angular-route.js,服务器:nodePost.js。index.html内容,主界面... 查看详情

小小小小小小之新闻案例

<!DOCTYPEhtml><html><headlang="en"><metacharset="UTF-8"><title></title><style>*{margin:0;padding:0;}.box{width:300px;height:213px;border:1pxsolid#4781a7;borde 查看详情

深度学习实战案例:新闻文本分类(代码片段)

深度学习多分类案例:新闻文本分类公众号:机器学习杂货店作者:Peter编辑:Peter大家好,我是Peter~这里是机器学习杂货店MachineLearningGrocery~之前介绍过一个单分类的问题。当每个数据点可以划分到多个类别... 查看详情

深度学习实战案例:新闻文本分类(代码片段)

深度学习多分类案例:新闻文本分类公众号:机器学习杂货店作者:Peter编辑:Peter大家好,我是Peter~这里是机器学习杂货店MachineLearningGrocery~之前介绍过一个单分类的问题。当每个数据点可以划分到多个类别... 查看详情

大数据分析案例-基于随机森林算法构建新闻文本分类模型

查看详情

网络编程案例多任务版tcp服务端程序开发(代码片段)

...代码importsocketimportthreading#处理客户端请求的任务defhandle_client_request(ip_port,new_client):print("客户端的ip和端口号为:",ip_port)#5.接收客户端的数据#收发消息都使用返回的这个新的套接字#循环接收客户端的消息whileTrue:recv_data=ne... 查看详情

client,offset.scroll系列/案例(代码片段)

一.client,offset,scroll系列1.client系列<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>client</title><styletype="text/css">.boxwidth:100px;height:100px;posi 查看详情

半天时间写完一个案例,循序渐进的掌握uni-app,使用uni-app完成一个简单项目——新闻列表(代码片段)

...创建新项目配置初始化1.1、创建一个项目,项目名称为新新闻,自己做案例的时候可以使用随便起名运行结果1.2、项目文件1.3、在page文件下创建一个user页面1.4、在pages.json中配置内容添加一个tabBar,图标在inconfont可免费下载"pages... 查看详情

前端css综合案例1-7:新闻页面五彩导航产品模块快报模块学成在线首页css三角土豆案例(代码片段)

文章目录案例1:新闻页面效果代码案例2:五彩导航效果代码案例3:产品模块效果代码案例4:快报模块效果代码案例5:学成在线首页效果代码总体代码案例6:土豆案例效果代码案例7:CSS三角效果代码... 查看详情

102.继承案例一(代码片段)

...例一我们像要编写一个网站,网站只有三个页面,首页,新闻页,产品展示页,我们可能进行如下实现1.首页#首页classHomePage(object):#头部信息defheader(self):print("头部信息!")#底部信息deffooter(self):print("底部信息!")#主体部分defbody(self)... 查看详情

scrapy案例:爬取翼蜂网络新闻列表和详情页面(代码片段)

#-*-coding:utf-8-*-importscrapyfromDemo.itemsimportDemoItemclassAbcSpider(scrapy.Spider):name=‘abcd‘allowed_domains=[‘www.cnyifeng.net‘]#start_urls=[‘http://abc.com/‘]#拼接urlbaseURL="http://www.cnyifen 查看详情

多任务版tcp服务端程序开发案例+源码(代码片段)

...代码:importsocketimportthreading#处理客户端的请求操作defhandle_client_request(service_client_socket,ip_port):#循环接收客户端发送的数据whileTrue:#接收客户端发送的数据recv_data=service_client_socket.recv(1024)#容器类型判断是否有数据可以直接使用if... 查看详情

django框架搭建入门案例(代码片段)

1.什么是web框架对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端;#示例:importsocketdefhandle_request(client):buf=client.recv(1024)client.send('HTTP/1.1200OK\r\n\r\n'.encode('utf8'))client.s 查看详情

java和vue开发的新闻系统

1.需求(1)用户能在本系统进行新闻浏览、阅读、新闻搜索、留言新闻、收藏新闻,可以发布新闻,对新闻进行编辑,插入图片,设置评论是否开放;用户未登录时只能浏览新闻。(2)系统管理员可以进行新闻分类管理... 查看详情

java和vue开发的新闻系统

1.需求(1)用户能在本系统进行新闻浏览、阅读、新闻搜索、留言新闻、收藏新闻,可以发布新闻,对新闻进行编辑,插入图片,设置评论是否开放;用户未登录时只能浏览新闻。(2)系统管理员可以进行新闻分类管理... 查看详情

编程和软件开发新闻/通讯[关闭]

】编程和软件开发新闻/通讯[关闭]【英文标题】:Programming&SoftwareDevelopmentNews/Newsletters[closed]【发布时间】:2011-04-2118:30:59【问题描述】:我目前订阅了MSDNFlash和RedGate的开发人员通讯,这很棒。我想找到更多的来源。在哪里/... 查看详情