案例-----简易新闻客户端
来源:互联网 发布:c 面向对象编程流程 编辑:程序博客网 时间:2024/06/05 16:51
本例将演示AsyncHttpClient和SmartImageView的综合使用。
1.目标:
1) 掌握开源项目AsyncHttpClient的使用
2) 掌握如何进行JSON解析
2.配置服务器:
由于需要从服务器上下载一个JSON,所以需要开启Tomcat服务器。在Tomcat根目录下找到bin文件夹,运行该文件下的startup.bat文件开启服务器,可在cmd下输入ipconfig来查看。然后在Tomcat的安装目录打开webapps文件夹,将NewsInfo.json文件放置在ROOT文件夹下。NewsInfo.json的代码如下:
[ { "icon": "http://10.3.24.180:8080/images/a.PNG", "title": "科技温暖世界", "content": "进入一个更有爱的领域", "type": "1", "comment": "69" }, { "icon": "http://10.3.24.180:8080/images/b.PNG", "title": "《神武》", "content": "新美术资源盘点,视觉新体验", "type": "2", "comment": "35" }, { "icon": "http://10.3.24.180:8080/images/c.PNG", "title": "南北车正式公布合并", "content": "南北车将于今日正式公布合并", "type": "3", "comment": "2" }, { "icon": "http://10.3.24.180:8080/images/d.PNG", "title": "萌呆了!汪星人抱玩偶酣睡", "content": "汪星人抱玩偶酣睡,萌翻网友", "type": "1", "comment": "25" }, { "icon": "http://10.3.24.180:8080/images/e.PNG", "title": "风力发电进校园", "content": "风力发电普进校园", "type": "2", "comment": "26" }, { "icon": "http://10.3.24.180:8080/images/f.PNG", "title": "地球一小时", "content": "地球熄灯一小时", "type": "1", "comment": "23" }, { "icon": "http://10.3.24.180:8080/images/g.PNG", "title": "最美公路", "content": "最美公路,难以想象", "type": "1", "comment": "23" }]
其中的10.3.24.180为自己主机的IP地址,另外还需要在ROOT下建立一个images文件夹来存放图片。 如果 在浏览器里输入http://10.3.24.180:8080/NewsInfo.json出现NewsInfo.json的内容则开启服务器成功。
3.新建一个项目
1)对应的布局文件(activity_main.xml)代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" tools:context=".MainActivity" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/loading" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:visibility="invisible"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载信息..." /> </LinearLayout> <ListView android:id="@+id/lv_news" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="5dp"/> </FrameLayout></LinearLayout>
2)ListView的Item布局文件news_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="65dp"> <com.loopj.android.image.SmartImageView android:id="@+id/siv_icon" android:layout_width="80dp" android:layout_height="60dp" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"></com.loopj.android.image.SmartImageView> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginTop="10dp" android:layout_toRightOf="@id/siv_icon" android:ellipsize="end" android:maxLength="20" android:singleLine="true" android:text="我是标题" android:textColor="#000000" android:textSize="18sp" /> <TextView android:id="@+id/tv_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_title" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:layout_toRightOf="@id/siv_icon" android:ellipsize="end" android:maxLength="16" android:maxLines="1" android:text="我是描述" android:textColor="#99000000" android:textSize="14sp" /> <TextView android:id="@+id/tv_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="5dp" android:layout_marginRight="10dp" android:text="评论" android:textColor="#99000000" android:textSize="12sp" /></RelativeLayout>
3)创建NewsInfo类,一定注意此类中的属性要与JSON文件中的相对应。
package bzu.edu.cn.imagebrowser.entity;/** * Created by yn on 2017/5/19. */public class NewsInfo { private String icon; private String title; private String content; private int type; private long comment; public long getComment() { return comment; } public void setComment(long comment) { this.comment = comment; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getContent() { return content; } public void setContent(String description) { this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; }}
4)自定义一个ListView适配器,代码如下:
package bzu.edu.cn.imagebrowser.adapter;import android.content.Context;import android.graphics.Color;import android.support.annotation.NonNull;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.TextView;import com.loopj.android.image.SmartImageView;import org.w3c.dom.Text;import java.util.List;import bzu.edu.cn.imagebrowser.R;import bzu.edu.cn.imagebrowser.entity.NewsInfo;/** * Created by yn on 2017/5/19. */public class MyAdapter extends ArrayAdapter<NewsInfo>{ public MyAdapter(Context context, List<NewsInfo> objects) { super(context, R.layout.news_item, objects); } @NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { NewsInfo newsInfo=getItem(position); View view; ViewHolder viewHolder; if(convertView==null){ view= LayoutInflater.from(getContext()).inflate(R.layout.news_item, null); viewHolder=new ViewHolder(); viewHolder.siv_icon=(SmartImageView)view.findViewById(R.id.siv_icon); viewHolder.tv_title=(TextView)view.findViewById(R.id.tv_title); viewHolder.tv_description=(TextView)view.findViewById(R.id.tv_description); viewHolder.tv_type=(TextView)view.findViewById(R.id.tv_type); view.setTag(viewHolder); } else{ view=convertView; viewHolder=(ViewHolder)view.getTag(); } viewHolder.siv_icon.setImageUrl(newsInfo.getIcon()); viewHolder.tv_title.setText(newsInfo.getTitle()); viewHolder.tv_description.setText(newsInfo.getContent()); int type=newsInfo.getType(); switch (type){ case 1: viewHolder.tv_type.setText("评论:"+newsInfo.getComment()); break; case 2: viewHolder.tv_type.setTextColor(Color.RED); viewHolder.tv_type.setText("专题"); break; case 3: viewHolder.tv_type.setTextColor(Color.BLUE); viewHolder.tv_type.setText("LIVE"); break; } return view; } class ViewHolder{ SmartImageView siv_icon; TextView tv_title; TextView tv_description; TextView tv_type; }}
5)创建工具类解析JSON文件,代码如下:
package bzu.edu.cn.imagebrowser.tools;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import java.lang.reflect.Type;import java.util.List;import bzu.edu.cn.imagebrowser.entity.NewsInfo;/** * Created by yn on 2017/5/19. */public class JsonParse { public static List<NewsInfo> getNewsInfo(String json) { Gson gson=new Gson(); Type listType=new TypeToken<List<NewsInfo>>(){ }.getType(); List<NewsInfo> newsInfos=gson.fromJson(json,listType); return newsInfos; }}
6)编写界面交互代码(MainActivity):
package bzu.edu.cn.imagebrowser;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import java.util.List;import bzu.edu.cn.imagebrowser.adapter.MyAdapter;import bzu.edu.cn.imagebrowser.entity.NewsInfo;import bzu.edu.cn.imagebrowser.tools.JsonParse;public class MainActivity extends AppCompatActivity { private ListView listView; private LinearLayout loading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.lv_news); loading=(LinearLayout)findViewById(R.id.loading); fillData(); } private void fillData(){ AsyncHttpClient asyncHttpClient=new AsyncHttpClient(); asyncHttpClient.get("http://10.3.24.180:8080/NewsInfo.json", new AsyncHttpResponseHandler() { @Override public void onSuccess(int i,org.apache.http.Header[] headers, byte[] bytes) { String json; try { json = new String(bytes,"utf-8"); List<NewsInfo> newsInfos= JsonParse.getNewsInfo(json); if (newsInfos==null){ Toast.makeText(MainActivity.this,"解析失败",Toast.LENGTH_LONG).show(); }else{ loading.setVisibility(View.INVISIBLE); listView.setAdapter(new MyAdapter(MainActivity.this,newsInfos)); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(int i,org.apache.http.Header[] headers, byte[] bytes, Throwable throwable) { } }); }}
7)在清单文件中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
4.运行程序效果图:
5.总结
本案例使用AsyncHttpClient和SmartImageView最终实现了获取服务器的JSON文件并将其解析出来显示到ListView上的功能。
- 简易新闻客户端案例
- 案例-----简易新闻客户端
- 网络编程案例简易新闻客户端
- 网络编程小案例之简易新闻客户端
- 简易新闻客户端
- 简易新闻客户端
- Android简易新闻客户端
- 新闻客户端案例开发
- 新闻客户端案例
- 案例--新闻客户端
- 实现案例新闻客户端
- 新闻客户端案例
- 案例----新闻客户端
- 新闻客户端案例
- 案例-----新闻客户端
- 新闻客户端案例
- 简单新闻客户端案例
- 新闻客户端综合案例
- Android drawable微技巧,你所不知道的drawable的那些细节
- 1056. Mice and Rice (25)
- leetcode 563. Binary Tree Tilt
- 3 Apache Shiro 授权
- c++实现最大堆建立(链表结构)和堆排序
- 案例-----简易新闻客户端
- linux16.04+cuda8.0+opencv3.1
- VMware虚拟机三种网络模式详解 Bridged(桥接模式)
- winpython下载安装
- Unity2d Sqlite
- xss攻击
- 【OpenCV3图像处理】形态学 --- 膨胀、腐蚀、开运算 闭运算、形态学梯度、顶帽运算、黑帽运算
- 夹逼定理
- 【模板】EK求最大流