复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看。

手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇

一个内容解析篇。

代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复。

MainActivity XML :只有一个ListView布局

<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="asynctask.zb.com.asynctask_02.MainActivity"> <ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview" />
</RelativeLayout>

adapter_item .XML  图片暂用系统默认 明天发图片异步加载和优化的文再讲

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="0dp">
<ImageView
android:id="@+id/tvimage"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/ic_launcher" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="0dp"> <TextView
android:layout_width="283dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:id="@+id/tvtitle"
android:text="这是标题"
android:paddingLeft="5dp"
android:textSize="20sp"/> <TextView
android:layout_width="262dp"
android:layout_height="wrap_content"
android:maxLines="3"
android:id="@+id/tvcontent"
android:text="这是内容"
android:paddingTop="2dp"
android:paddingLeft="5dp"
android:textSize="12dp"
/>
</LinearLayout>
</LinearLayout>

===========================================

MainActivity:

1 。

 获取到jsonString Log.d(TAG, jsonString);打印下是否可以获取到JSON数据

2.在
        return nesBeanList;
处设置断点查看下返回的List<NewsBean>


package asynctask.zb.com.asynctask_02;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
//初始化
String TAG = "zbace";//日志TAG
private ListView listView;
private String URL =" http://www.imooc.com/api/teacher?type=4&num=30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
new NewsAsyncTask().execute(URL);
}
/** Ace in 2016/1/20
* 创建getJsonData(传入URL地址), 把从流中读取的JSON数据封装进NewsBean中放入List集合
* 1 调用readString方法获取到jason格式的字符串, openStream与url.openConnection().geTinpuStream() 一样;
* 获取到jsonString Log.d(TAG, jsonString);打印下是否可以获取到JSON数据
* 2 然后创建JSONObject对象,传入jsonString。
* 3 getJSONArray("data")方法 从中取出JSONArray,
* 在创建个for循环遍历JSONArray并取出newsicon,title,content,等信息
* 最后把信息放入NewsBean,再添加进数组
*
*/ private List<NewsBean> getJsonData(String url){
List<NewsBean> nesBeanList = new ArrayList<>(); try {
String jsonString = readStream(new URL(url).openStream());
Log.d(TAG, jsonString);
JSONObject jsonObject;
NewsBean newsBean;
try { jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0 ; i <jsonArray.length(); i++ ){
//每个JSONArray 的元素都是一个JSONObject
jsonObject = jsonArray.getJSONObject(i);
//把得到的jsonObject, 放入NewsBean
newsBean = new NewsBean();
newsBean.newsIconUrl = jsonObject.getString("picSmall");
newsBean.newsTitle = jsonObject.getString("name");
newsBean.newsContent = jsonObject.getString("description");
nesBeanList.add(newsBean);
} } catch (JSONException e) {
e.printStackTrace();
} } catch (IOException e) {
e.printStackTrace();
} return nesBeanList; //记得返回list
} /** Ace in 2016/1/20
* readStream方法是为了读取流中的数据从而获得流里的JSONString
*
* */ private String readStream(InputStream is){
InputStreamReader isr;
String result = "";
try {
String line = "";
//用把字节流转换为字符流(不转字符流无法显示中文),并设置编码为UTF-8;
isr = new InputStreamReader(is,"utf-8");
//套上缓冲流
BufferedReader br = new BufferedReader(isr);
//创建一个while循环
while ((line=br.readLine()) != null ){
result += line;//这就得到了我们需要的JSON字符串,从JSON字符串中就可以得到我们想要数据
} } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return result;
}
/** Ace in 2016/1/20
* 异步获取JSON数据
*
* */ class NewsAsyncTask extends AsyncTask<String,Void,List<NewsBean>>{
@Override
protected List<NewsBean> doInBackground(String... params) {
return getJsonData(params[0]);//params就是我们传进来的String URL 网址 只传进来了一个 就输入[0]
} @Override
protected void onPostExecute(List<NewsBean>nesBeanList) {
super.onPostExecute(nesBeanList);
NewsAdapter newsAdapter = new NewsAdapter(MainActivity.this ,nesBeanList);
listView.setAdapter(newsAdapter); }
} }

================

NewsAdapter ViewHolder

package asynctask.zb.com.asynctask_02;

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 java.util.List; /**
* Created by Ace on 2016/1/20.
*/
public class NewsAdapter extends BaseAdapter {
private List<NewsBean> mlist;
private LayoutInflater mInflater; public NewsAdapter(Context context,List<NewsBean>data){
//映射下 把data传给mlist
mlist = data;
//从一个Context中,获得一个布局填充器,这样你就可以使用这个填充器的inflater.inflate()来把xml布局文件转为View对象了,然后利用view对象,findViewById就可以找到布局中的组件
mInflater = LayoutInflater.from(context);
}
@Override
public Object getItem(int position) {
return mlist.get(position);
} @Override
public int getCount() { return mlist.size();
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder= null;
if (convertView == null){
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.adapter_item,null);
viewHolder.iconimage = (ImageView)convertView.findViewById(R.id.tvimage);
viewHolder.title = (TextView)convertView.findViewById(R.id.tvtitle);
viewHolder.content = (TextView)convertView.findViewById(R.id.tvcontent);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
viewHolder.iconimage.setImageResource(R.mipmap.ic_launcher);
viewHolder.title.setText(mlist.get(position).newsTitle);
viewHolder.content.setText(mlist.get(position).newsContent);
}
return convertView;
} class ViewHolder{
public TextView title;
public ImageView iconimage;
public TextView content; }
}

NewsBean 封装类

package asynctask.zb.com.asynctask_02;

/**
* Created by Administrator on 2016/1/20.
*/
public class NewsBean {
public String newsIconUrl;
public String newsTitle;
public String newsContent;
}

先就这样回来补上效果图

Ace教你一步一步做Android新闻客户端(一)的更多相关文章

  1. Ace教你一步一步做Android新闻客户端(四) 优化Bitmap大法

    我计划着把需要用到的知识分解开来写,趁着我们要开发这款客户端的机会把安卓所有移动客户端开发中的技术贯穿其中,也是我自己成长的过程.By Ace in 20160121 我们开发一款新闻客户端程序,它的 ...

  2. Ace教你一步一步做Android新闻客户端(五) 优化Listview

    今天写存货了 调试一些动画参数花了些时间 ,嘿嘿存货不多了就没法做教程了,今天来教大家优化listview,等下我把代码编辑下 这次代码有些多 所以我把条理给大家理清楚.思路就是把加载图片的权利交给O ...

  3. Ace教你一步一步做Android新闻客户端(三) JSON数据解析

    对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,现在给大家讲解一下json这个知识点, 1 如何通过json-lib和gson这两个json解析库来对解析我们的j ...

  4. 阿冰教你一步一步做Android新闻客户端(二)两种异步线程加载图片的方法

    哈哈哈抱着没人看的心态随便写,直接上代码,各位看官看注释 一种Thread  一种AsyncTask 先不说用框架 public class ImageLoader { private ImageVi ...

  5. 用TableView做的新闻客户端展示页面

    用TableView做的新闻客户端展示页面 //  MyTableViewImageCell.m //  SildToDo // //  Created by WildCat on 13-8-18. ...

  6. IOS学习之路十四(用TableView做的新闻客户端展示页面)

    最近做的也个项目,要做一个IOS的新闻展示view(有图有文字,不用UIwebview,因为数据是用webservice解析的到的json数据),自己一直没有头绪,可后来听一个学长说可以用listvi ...

  7. 一步一步教你如何在linux下配置apache+tomcat(转)

    一步一步教你如何在linux下配置apache+tomcat   一.安装前准备. 1.   所有组件都安装到/usr/local/e789目录下 2.   解压缩命令:tar —vxzf 文件名(. ...

  8. 一步一步教你使用Git

    一步一步教你使用Git 互联网给我们带来方便的同时,也时常让我们感到困惑.随便搜搜就出一大堆结果,然而总是有大量的重复和错误.小妖发出的内容,都是自己实测过的,有问题请留言. 现在,你已经安装了Git ...

  9. 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app

    一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...

随机推荐

  1. .net Stream篇(六)

    BufferedStream 目录: 简单介绍一下BufferedStream 如何理解缓冲区? BufferedStream的优势 从BufferedStream 中学习装饰模式 如何理解装饰模式 ...

  2. EF 配置实现建表与迁移

    通过EF 作为操作数据库的工具有一段时间了,也做了几个相对不大的项目,慢慢的也对EF的使用摸索出来了一些规则,虽然说不是技术难点,但是,我说的是但是,能够提高我们开发效率的棉花糖有时我们还是必须要吃的 ...

  3. Mybatis-generator逆向工程

    $.Mybatis-generator介绍 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之 ...

  4. 「TJOI2015」线性代数

    题目链接 戳我 \(Describe\) 题目描述 为了提高智商,\(ZJY\)开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个\(n×n\)的矩阵\(B\)和一个\(1×n\)的矩阵\ ...

  5. 第0篇 Python前言

    1.注释 1)注释的作用: 用自己熟悉的语言在代码中添加注释,方便后期自己查看和理解,也方便其他人查看和理解代码含义. 2)单行注释: 以#号开头,#后面的所有内容均不会被程序执行,起到辅助说明的作用 ...

  6. k8s(未完待续)

    K8s简介Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展. 使用Kubernetes可以  自动化容器的部署和复制  随时扩展或收缩容器规模  将容器 ...

  7. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...

  8. CBV请求流程源码分析

    一.CBV流程解析 urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^book/', views.BookView.as ...

  9. 线段树(压位)luogu P1558色板游戏

    题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...

  10. Python博文列表

    手把手|100行Python代码自动抢火车票!(包教包会):https://zhuanlan.zhihu.com/p/32928355 最全中华古诗词数据库, :https://github.com/ ...