新闻客户端案例开发

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:   新闻客户端,顾名思义就是看新闻用的客户端。   该新闻用到的知识模块有:android高级界面设计(Fragment、ViewPager),android网络通信(http通信),开源组件(xutils框架-HttpUtils模块、xutils框架-BitmapUtils模块),开源框架(library)。所需jar包:xUtils、gson、android-support-

  新闻客户端,顾名思义就是看新闻用的客户端。

  该新闻用到的知识模块有: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开源代码框架库,是用来实现简易新闻客户端上端的滑动标签,同时它与ViewPager控件结合最终实现的是Fragment的动态实现。
简易新闻客户端上端滑动标签是用了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>

既然是一个新闻客户端那必须要有数据,那么数据当然就需要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   


目录
相关文章
|
22天前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
60 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
7天前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
3月前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
207 4
|
6月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
218 0
零撸游戏广告变现模式系统开发部署源码搭建
零撸游戏广告变现模式系统开发部署源码搭建
|
新零售 人工智能 供应链
七星创客/艾倍生/推三返一/系统开发方案项目/开发案例/规则玩法/源码程序
  所谓新零售即是个人、企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
新零售 人工智能 算法
农场养成种树游戏系统开发(案例项目)丨区块链DAPP种树游戏系统开发(开发案例)及源码方案
  即企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
新零售 数据可视化 前端开发
案例酷 | 传统家局卖场升级:居然之家“变形记”
编者按: 近日,在居然之家战略投资发布会上,居然之家表示,在向“线性服务+产业平台服务”模式转型,将打造一个产业服务平台。回顾居然之家最新财报业绩,以及数字化进展为主的新发展,展现它的投资潜力和价值。
161 0
案例酷 | 传统家局卖场升级:居然之家“变形记”
|
新零售 大数据 云计算
泰山众筹商城系统开发案例详细/方案程序/成熟技术/开发项目/源码平台
  新零售指的就是线上、线下和物流必须结合在一起。也就是说,线下的企业必须走到线上去,线上的企业必须走到线下来,线上、线下同现代物流结合在一起,才能真正创造出新的销售方式。