安卓之旅第十一站--简易新闻客户端
来源:互联网 发布:七天网络app在哪下载 编辑:程序博客网 时间:2024/05/16 16:09
1、首先创建一个应用程序,将我们需要的包导进lib文件夹下。
2、配置Tomcat服务器,将JSON文件和images文件夹放在webapps/Root文件夹下,然后在bin文件夹下,通过startup.bat开启服务器。(注意:在运行Android应用程序前一定要启动tomcat服务器, 否则无法加载数据。一定在清单文件里添加网络访问允许,否则无法连接服务器。 服务器域名请求一定要写服务器的具体地址, 不能写localhost,因为localhost是访问的android本机服务器。 )
添加权限:
<uses-permission android:name="android.permission.INTERNET" />
Json文件内容如下:(此内容是已写好的,为了方便就截了一张图,注意的是:途中的地址要改成与自己电脑一致的地址)
3、设计用户交互界面。
程序对应的布局文件(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" android:orientation="vertical" tools:context=".MainActivity"> <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="3dp" /> </FrameLayout></LinearLayout>
4、创建ListView Item的布局
<?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:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher"></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>5、创建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; }}
6、自定义一个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; }}
7、创建工具类解析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库解析JSON数据 Gson gson = new Gson(); //创建一个TypeToken的匿名子类对象,并调用对象的getType()方法 Type listType = new TypeToken<List<NewsInfo>>() { }.getType(); //把获取的信息集合存到newsInfos中 List<NewsInfo> newsInfos = gson.fromJson(json, listType); return newsInfos; }}8、编写界面交互代码(MainActivity),实现使用AysncHttpClient获取服务器上的JSON文件,并调用工具类JsonParse的getNewsInfo()方法解析JSON文件得到NewsInfo对象的List集合。
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 Main2Activity extends AppCompatActivity { private ListView listView; private LinearLayout loading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); listView = (ListView) findViewById(R.id.lv_news); loading = (LinearLayout) findViewById(R.id.loading); fillData(); } //使用AsyncHttpClient访问网络 private void fillData() { //创建AsyncHttpClient实例 AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); //使用GET方法请求 asyncHttpClient.get("http://10.61.15.146: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(Main2Activity.this, "解析失败", Toast.LENGTH_LONG).show(); } else { //更新界面 loading.setVisibility(View.INVISIBLE); listView.setAdapter(new MyAdapter(Main2Activity.this, newsInfos)); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(int i, org.apache.http.Header[] headers, byte[] bytes, Throwable throwable) { //请求失败 Toast.makeText(Main2Activity.this, "解析失败", Toast.LENGTH_LONG).show(); } }); }}
9、运行结果图:
阅读全文
0 0
- 安卓之旅第十一站--简易新闻客户端
- 安卓开发之简易新闻客户端
- 安卓新闻客户端
- Android---网络编程之简易新闻客户端
- 安卓基础笔记5之新闻客户端--OKHttp查询
- 简易新闻客户端
- 简易新闻客户端案例
- 简易新闻客户端
- 案例-----简易新闻客户端
- Android简易新闻客户端
- 如何开发安卓新闻客户端?
- 安卓新闻客户端笔记积累
- [安卓]新闻客户端(一)Splash
- [安卓]新闻客户端(二)引导页
- [安卓]新闻客户端(七) 一些bug~
- 安卓新闻客户端的简单实现
- android开发笔记之网络编程—简易新闻客户端
- 网络编程小案例之简易新闻客户端
- 跟着笨叔叔一起省电
- Java基础知识总结
- Echarts柱状图formatter函数的使用和页面显示的bug解决
- 极具个性化的【自定义日历】(预热篇)—超详细,记录你的学习计划与完成情况
- VR教育进入新加坡课堂
- 安卓之旅第十一站--简易新闻客户端
- Android环境杂记
- C#多线程技术
- 周末免费玩VR!Rift玩家的福利:BlazeRush赛车游戏
- Android动画体系
- Node.js
- 微信授权登录接口调试
- Flex布局实战篇
- Cocos场景切换时清理缓存!!CCTextureCache、CCSpriteFrameCache、CCAnimationCache