Android打造属于自己的新闻平台(客户端+服务器)

完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。

一、新闻的数据库的构建

脚本代码如下:(使用的mysql5.0 数据库)

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

-- Database: `newsdemo`
-- 表的结构 `news`

CREATE TABLE IF NOT EXISTS `news` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `title` text NOT NULL,
 `desc` text NOT NULL,
 `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `content_url` text NOT NULL,
 `pic_url` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- 转存表中的数据 `news`
--

INSERT INTO `news` (`id`, `title`, `desc`, `time`, `content_url`, `pic_url`) VALUES
(1, 'Oracle解锁封锁的账号', '我们在安装Oracle的时候最后一步有一个管理账户的,里边可以解锁所所需的账户', '2015-03-15 11:50:03', 'http://blog.csdn.net/xlgen157387/article/details/41595709', 'http://img.blog.csdn.net/20141129144613046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center'),
(2, 'Android程序之全国天气预报查询(聚合数据开发)', '项目演示效果如下: 项目源代码下载地址: 访问密码 2eac二、使用 聚合数据SDK:', '2015-03-15 11:50:13', 'http://blog.csdn.net/xlgen157387/article/details/44246119', 'http://img.blog.csdn.net/20150314095028546');

执行结果如下:(由于这是使用的appserv,所以在phpMyAdmin中看到的这种效果1)

二、将数据库中的数据转化为json数据

由于使用的是php语言,所以要安装appserv(这个东西百度一下就知道怎么使用,不在研究!)

(1)在appserv目录下的www目录下创建一个文件夹NewsDemo,文件夹中创建两个php文件如下:

连接数据库的文件mysql_connect.php

<?php

  $con = mysql_connect("localhost", "root", "your password!");
  //设置字符集为utf8
  mysql_query("SET NAMES 'utf8'");
  mysql_query("SET CHARACTER SET utf8");
  mysql_query("SET CHARACTER_SET_RESULT=utf8");

  if (!$con){
    die(mysql_error());
  }

  mysql_select_db("newsdemo", $con);
?>

具体用于创建json数据的getNewsJSON.php

<?php

/*
 * 获得JSON数据
 * 返回值:title desc time content_url pic_url
 */

 require 'mysql_connect.php';

 $n = 0;
 $result = mysql_query("select * from news");
 while ($row = mysql_fetch_array($result)){
  $arr[$n++] = array("title" => $row['title'],
            "desc" => $row['desc'],
            "time" => $row['time'],
            "content_url" => $row['content_url'],
            "pic_url" => $row['pic_url']
          );
 }

 //数组转换为JSON字符串
 echo json_encode($arr);

?>

然后访问地址:http://localhost:8080/NewsDemo/getNewsJSON.php

如果出现以下“乱码”表示成功!
这里写图片描述

另外给大家一个在线查看json数据的网址:http://json.parser.online.fr/

到此数据库的准备完成,开始做客户端!

三、客户端的实现

MainActivity.java如下:

package com.xuliugen.news;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.xuliugen.news.adapter.NewsAdapter;
import com.xuliugen.news.model.News;
import com.xuliugen.news.utils.HttpUtils;

public class MainActivity extends Activity implements OnItemClickListener{

  private ListView lvNews;
  private NewsAdapter adapter;
  private List<News> newsList;

  //此处需要修改为自己的服务器地址:也就是具体的服务器地址:这里不要写你的localhost或者127.0.0.1因为这是要在手机上运行的!
  public static final String GET_NEWS_URL = "http://172.23.252.89:8080/NewsDemo/getNewsJSON.php";

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

    lvNews = (ListView) findViewById(R.id.lvNews); //一条一条的消息展示消息
    newsList = new ArrayList<News>(); //初始化
    adapter = new NewsAdapter(this, newsList); //也是初始化,会在后期执行getNewsJSON()方法之后更新

    lvNews.setAdapter(adapter); //设置构造器
    lvNews.setOnItemClickListener(this);

    //这里执行了网络的的请求操作
    HttpUtils.getNewsJSON(GET_NEWS_URL, getNewsHandler); //传入的一个handler对象
  }

  // 这里是访问网络数据的时候,返回的handler
  private Handler getNewsHandler = new Handler(){

      /**
       * 这个方法是Handler自带的方法,用于接受返回的数据
       */
      public void handleMessage(android.os.Message msg) {
        String jsonData = (String) msg.obj;
        System.out.println(jsonData);
        try {

          //下边是解析json
          JSONArray jsonArray = new JSONArray(jsonData);
          for (int i=0;i<jsonArray.length();i++){
            JSONObject object = jsonArray.getJSONObject(i);
            String title = object.getString("title");
            String desc = object.getString("desc");
            String time = object.getString("time");
            String content_url = object.getString("content_url");
            String pic_url = object.getString("pic_url");
            newsList.add(new News(title, desc, time, content_url, pic_url));
          }
          adapter.notifyDataSetChanged();//通知适配器数据发生变化
        } catch (Exception e) {
          e.printStackTrace();
        }
      };
    };

  /**
   * 每一个条目的点击事件
   */
  @Override
  public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {

    //获取被点击的对象
    News news = newsList.get(position);
    Intent intent = new Intent(this, BrowseNewsActivity.class);
    intent.putExtra("content_url", news.getContent_url()); //根据被点击的对象,获取其url
    startActivity(intent);
  }

}

HttpUtils.java如下:

package com.xuliugen.news.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

/**
 * 访问网络的工具类
 *
 * @author xuliugen
 *
 */
public class HttpUtils {

  public static void getNewsJSON(final String url, final Handler handler) {

    //要访问网络,开启一个线程
    new Thread(new Runnable() {
      @Override
      public void run() {
        HttpURLConnection conn;
        InputStream inputStream;
        try {
          conn = (HttpURLConnection) new URL(url).openConnection();
          conn.setRequestMethod("GET");
          inputStream = conn.getInputStream();
          BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
          String line = "";
          StringBuilder result = new StringBuilder(); //StringBuilder初始化不可以null
          while ((line = reader.readLine()) != null) {
            result.append(line);
          }

          //使用handler的话要使用Message
          Message msg = new Message();
          msg.obj = result.toString();

          // 通知主线程handler
          handler.sendMessage(msg);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }

  /**
   * 设置图片的信息
   *
   * 在适配器里边调用
   *
   * @param ivPic 需要设置的view组件
   * @param pic_url 图片的地址
   */
  public static void setPicBitmap(final ImageView ivPic, final String pic_url) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection();
          conn.connect();
          InputStream is = conn.getInputStream();
          Bitmap bitmap = BitmapFactory.decodeStream(is);
          ivPic.setImageBitmap(bitmap);
          is.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }

}

用于保存json数据的bean–》News.java

package com.xuliugen.news.model;

/**
 * 与json数据相对应的bean
 *
 * @author xuliugen
 *
 */
public class News {

  private String title;
  private String desc;
  private String time;
  private String content_url;
  private String pic_url;

  /**
   * 全参的构造函数
   *
   * @param title
   * @param desc
   * @param time
   * @param content_url
   * @param pic_url
   */
  public News(String title, String desc, String time, String content_url,
      String pic_url) {
    setTitle(title);
    setDesc(desc);
    setTime(time);
    setContent_url(content_url);
    setPic_url(pic_url);
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getDesc() {
    return desc;
  }

  public void setDesc(String desc) {
    this.desc = desc;
  }

  public String getTime() {
    return time;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public String getContent_url() {
    return content_url;
  }

  public void setContent_url(String content_url) {
    this.content_url = content_url;
  }

  public String getPic_url() {
    return pic_url;
  }

  public void setPic_url(String pic_url) {
    this.pic_url = pic_url;
  }

}

NewsAdapter.java如下:

package com.xuliugen.news.adapter;

import java.util.List;

import android.content.Context;
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.xuliugen.news.R;
import com.xuliugen.news.model.News;
import com.xuliugen.news.utils.HttpUtils;

/**
 * 用于显示在界面上的item
 *
 * @author piaodangdehun
 *
 */
public class NewsAdapter extends BaseAdapter {

  private Context context;
  private List<News> newsList;

  /**
   * 构造方法的时候传入newsList
   *
   * @param context
   * @param newsList 需要填入的news信息
   */
  public NewsAdapter(Context context, List<News> newsList) {
    this.context = context;
    this.newsList = newsList;
  }

  @Override
  public int getCount() {
    return newsList.size();
  }

  @Override
  public News getItem(int position) {
    return newsList.get(position);
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  /**
   * 为news-item中的布局赋值
   */
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) { //如果为空则重新创建
      convertView = LayoutInflater.from(context).inflate(R.layout.news_item, null);
    }
    // 获得news-item中的控件
    TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
    TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc);
    TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime);
    ImageView ivPic = (ImageView) convertView.findViewById(R.id.ivPic);

    News news = newsList.get(position);
    tvTitle.setText(news.getTitle());
    tvDesc.setText(news.getDesc());
    tvTime.setText(news.getTime());

    String pic_url = news.getPic_url();
    HttpUtils.setPicBitmap(ivPic, pic_url);

    return convertView;
  }

}

具体的布局文件省略,看一下清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.xuliugen.news"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />
  <uses-permission android:name="android.permission.INTERNET"/>

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.xuliugen.news.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="BrowseNewsActivity"></activity>
  </application>

</manifest>

好啦!具体项目源代码资源如下: http://xiazai.jb51.net/201606/yuanma/Androidnews(jb51.net).rar

知识点总结:数据库数据到json数据格式的转换、访问json数据的方法及解析json的方法、适配器等。

(0)

相关推荐

  • Android实现网易新闻客户端首页效果

    关于实现网易新闻客户端的界面,以前写过很多博客,请参考: Android实现网易新闻客户端效果 Android实现网易新闻客户端侧滑菜单(一) Android实现网易新闻客户端侧滑菜单(二) 今天用ViewPager + FragmentAdapter + ViewPagerIndicator来实现. ViewPagerIndicator是一款分页指标小部件兼容ViewPager,封装上做得非常不错,目前已为众多知名应用所使用.具体API的使用,大家可以下载官方demo示例研究研究就知道啦! 下

  • 基于PHP后台的Android新闻浏览客户端

    本文实例为大家分享了Android新闻浏览客户端,基于php后台,供大家参考,具体内容如下 1.使用HBuilder进行PHP环境配置,测试是否可以查询MySQL语句,之前都已经详细说明过了. 2.此处php后台实现mysql的查询功能,并以JSON数据格式返回个客户端 在PHP此处建立一个mysql_connect.php文件,实现数据库的连接,并设置字符集格式. <?php $con = mysql_connect("localhost","root",&

  • Android模拟实现网易新闻客户端

    首先我们先看一下要模拟的界面 我们主要实现的就是ListView解析json文件中的数据,UI布局很简单不做赘述. 这里我们需要一个服务器来实现数据的动态更新, 这里我们用到的是Tomcat8.0. 首先我们把需要解析的json文件放置到Tomcat的webapp文件下的ROOT里面,方便我们解析. 首先我们创建一个JsonParse类用来解析json文件: package cn.edu.bzu.myapplication.Tools; import com.google.gson.Gson;

  • Android实现网易新闻客户端侧滑菜单(1)

    Android中很多产品(比如360手机助手.网易菜单...)都采用侧滑菜单的展现形式,采用这种展现形式 1.能把更多的展现内容都存放在菜单中 2.设计上也能体现出视觉效果 现在这种交互方式越来越流行了,虽然这种交互方式可以通过自定义组件的方式来实现,但是用三方开源库更简单. SlidingMenu:SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果. 地址:https://github.com/

  • Android 仿网易新闻客户端分类排序功能

    先来看看网易新闻客户端以及自己实现的效果图,效果当然还是网易的好 gridviewsort.gif 如何实现拖拽一个Item 用WindowManager添加一个ImageView,并且将这个ImageView的显示图片设置成被拖拽item的截图,截图可以通过View的getDrawingCache获得.拖拽的时候,隐藏原始的item.处理触摸事件的ActionMove,调整ImageView的位置,跟随手指移动.在ActionUp的时候removeView GridView @Override

  • Android网络编程之简易新闻客户端

    一. 通过一个案例"新闻客户端"向大家演示AsyncHttpClient和SmartImageView的综合使用. 运行结果如下: 1.首先我们了解一下相关知识: SmartImageView的使用 市面上一些常见软件,例如手机QQ.天猫.京东商场等,都加载了大量网络上的图片.用Android自带的API实现这一功能十分麻烦而且耗时.为此,编程爱好者开发了一个开源项目--SmartImageView. https://github.com/loopj/android-smart-ima

  • Android实现网易新闻客户端侧滑菜单(2)

    前面已经讲过通过三方开源库SlideMenu来实现这种效果,请参考Android实现网易新闻客户端侧滑菜单(一) 今天通过自定义View来实现这种功能. 代码如下: SlideMenu.java package com.jackie.slidemenu.view; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view

  • Android打造属于自己的新闻平台(客户端+服务器)

    完全属于自己的新闻展示平台,展示给大家,希望大家喜欢. 一.新闻的数据库的构建 脚本代码如下:(使用的mysql5.0 数据库) SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- Database: `newsdemo` -- 表的结构 `news` CREATE TABLE IF NOT EXISTS `news` ( `id` int(10) NOT NULL AUTO_IN

  • Android打造炫酷的电影票在线选座app在线选座功能

    不知道大家有没有用过,淘宝电影客户端(淘票票)买过电影票,纵观各类在线选座app的在线选座功能 淘宝在线选座功能用户体验最好,用起来最顺手,夸张点说已经到了炉火纯青的地步,下面我们看一下效果: 效果分析: 整个控件分成几个部分,座位图区域.座位缩略图区域.行号区域.屏幕区域 1.座位图可以自由的移动缩放,放大缩小移动后会自动回弹到合适的位置,选中座位会自动放大到合适比例. 2.行号部分跟着座位图缩放以及上下移动,屏幕区域跟着座位图左右移动缩放. 3.当手指按下的时候会出现缩略图,缩略图上有个红色

  • Java 实战范例之线上新闻平台系统的实现

    一.项目简述 功能: 用户的登录注册,新闻的分类查询,评论留言,投稿,新闻的后台管理,发布,审核,投稿管理以及汇总统计等等. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持) 项目技术: Jsp + Jdbc + Servlert + html+ css + JavaScript + JQuery + Ajax + Fileupload 登录验证码代码生成: @C

  • android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 附上Demo 首先第一步打开打开相册选择视频文件: Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); ((Activity)

  • Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法

    要原因是主体样式设置的问题:这里把appTheme设置一个style即可: <item name="android:windowBackground">@color/white</item> <!--下面这个属性很重要,有时候会出现某些机型在调用系统相册的时候,短暂的出现手机桌面现象--> <item name="android:windowIsTranslucent">false</item> <i

  • 详解MySQL客户端/服务器运行架构

    目录 前言 MySQL客户端/服务器架构 客户端与服务器连接的过程 TCP/IP 命名管道和共享内存 Unix域套接字文件 小结 前言 之前对MySQL的认知只限于会写些SQL,本篇开始进行对MySQL进行深入的学习,记录和整理下自己对MySQL不熟悉的地方.如果有需要可以关注我的专栏一起学习,共同进步!关于mysql的安装就不说了,直接从mysql的客户端/服务器运行架构开始学习.Let′s go~ MySQL客户端/服务器架构 MySQL其实跟我们平时使用的程序一样,是由两部分组成的,一部分

  • Android组件DrawerLayout仿网易新闻v4.4侧滑菜单

    概述 今天这篇博客将记录一些关于DrawerLayout的基本用法,我想关于DrawerLayout的用法也许有不少不够了解,这也是比较正常的事情,因为DrawerLayout作为Android组件是Google后来在android中添加的,在android.support.v4包下.那么,DrawerLayout是一个怎么的组件呢?我们知道,当我们使用Android上各类App的时候,是不是注意过App主页上通常有一个"侧滑菜单"?关于侧滑菜单的实现,我在前面博客里有一些介绍,想多些

  • Android打造属于自己的时间钟表

    1.概述 本文主要讲解的是如何自定义一个时间钟表,通过简单的练习可以简单学习Android当中自定义view的一些常用绘图技巧,优化android绘图操作.言归正传,首先看下我们需要实现的效果: 当我们看到这个效果的时候脑子里应该有一定的思路了,我们应该把它分解成以下几个步骤: 1.仪表盘(圆) 2.刻度线(长 中 短) 3.刻度值(1-12) 4.指针(时  分  秒) 5.移动指针,计算指针位置 现在我们已经很清楚自己的思路了,那么我们一个一个来. 第一步:1.自定义View的属性,首先在r

随机推荐