新闻客户端
2017-05-24 20:23
155 查看
新闻客户端主要运用了AsyncHttpClient和SmartImageView的综合运用,通过实现获取服务器的XML文件将其解析出来捆绑显示导ListView上。
1.新闻客户端的布局文件(activity_Main.xml),这个界面主要包含了提示用户数据正在加载中的控件ProgressBar,TextView以及用于展示新闻信息的ListView.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="cn.edu.bzu.anew.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" /> </FrameLayout> </RelativeLayout>
2.为ListView控件创建一个布局(news_item.xml),这个布局文件中用到了自定义控件SmartImagrView和三个分别用于展示新闻标题,新闻内容以及新闻评论数的TextView.其中SmartImageView中的scaleType属性,这个属性是ImageView中的,用来控制图片来匹配View大小。
<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.界面的交互代码,UI界面创建完成,交互代码用于实现获取服务器的NewsInfo.xml文件解析并将解析信息设置到ListView上。
package cn.edu.bzu.anew; 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.io.UnsupportedEncodingException; import java.util.List; import cn.edu.bzu.anew.Tools.JsonParse; import cn.edu.bzu.anew.adapter.NewsAdapter; import cn.edu.bzu.anew.entity.NewsInfo; public class MainActivity extends AppCompatActivity { private ListView lvNews; private List<NewsInfo> newsInfos; private LinearLayout loading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvNews=(ListView)findViewById(R.id.lv_news); loading=(LinearLayout)findViewById(R.id.loading); fillData(); } private void fillData(){ AsyncHttpClient client =new AsyncHttpClient(); client.get("http://10.61.28.176:8080/NewsInfo.json",new AsyncHttpResponseHandler(){ @Override public void onSuccess(int i, org.apache.http.Header[] headers, byte[] bytes) { try{ String json=new String(bytes,"utf-8"); newsInfos= JsonParse.getNewsInfo(json); if(newsInfos==null){ Toast.makeText(MainActivity.this,"解析失败", Toast.LENGTH_LONG).show(); }else{ loading .setVisibility(View.INVISIBLE); lvNews.setAdapter(new NewsAdapter(MainActivity.this,newsInfos)); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } @Override public void onFailure(int i, org.apache.http.Header[] headers, byte[] bytes, Throwable throwable) { } } ); } }
4.创建NewsInfo类,它是对象是新闻信息的JavaBeen.其中定义了IconPath图片路径,新闻标题,新闻描述和新闻评论五种属性。
iupackage cn.edu.bzu.anew.entity; /** * Created by Administrator on 2017/5/18. */ public class NewsInfo { private String icon; private String title; private String description; private int type; 9f5e private long comment; public NewsInfo(String icon, String title, String description, int type, long comment) { this.icon = icon; this.title = title; this.description = description; this.type = type; this.comment = comment; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public int getType() { return type; } public void setType(int type) { this.type = type; } public long getComment() { return comment; } public void setComment(long comment) { this.comment = comment; } }
5.创建JsonParse 文件。
package cn.edu.bzu.anew.Tools; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; import cn.edu.bzu.anew.entity.NewsInfo; /** * Created by Administrator on 2017/5/18. */ 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. 创建adapter包,创建NewsAdapter类
public class NewsAdapter extends ArrayAdapter<NewsInfo>{ public NewsAdapter(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);//传递position,获取当前位置对应的newsinfo新闻信息 View view=null; viewHolder viewHolder; if(convertView==null){ //判断convertView中是否加载了布局,有没有缓存。为空说明没有缓存 view=LayoutInflater.from(getContext()).inflate(R.layout.news_item,null); viewHolder=new viewHolder(); viewHolder.siv= (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.setImageUrl(newsinfo.getIcon()); viewHolder.tv_title.setText(newsinfo.getTitle());//传递题目 viewHolder.tv_description.setText(newsinfo.getDescription()); viewHolder.tv_type.setText(newsinfo.getType()+""); return view; } class viewHolder{//添加类,封装需要查找的控件 TextView tv_title; TextView tv_description; TextView tv_type; SmartImageView siv; } }
7.smartImageView的使用
市面上一些常见软件,例如手机QQ、天猫、京东商场等,都加载了大量网络上的图片。
开源项目SmartImageView的出现主要是为了加速从网络上加载图片,它继承ImageView类支持根据URL地址加载图片、支持异步加载图片、支持图片缓存等。
https://github.com/loopj/Android-smart-image-view
下载jar包导入lib文件下。
8. AsyncHttpClient的使用在Android开发中,发送、处理HTTP请求十分常见,如果每次与服务器进行数据交互都需要去开启一 个子线程,这样是非常麻烦的。为了解决这个问题,一些开发者开发出了开源项目—— AsyncHttpClient。
– https://github.com/loopj/android-async-http
– http://hc.apache.org/download.cgi
– AsyncHttpClient是对HttpClient的再次包装。AsyncHttpClient的特点有,发送异步HTTP请求、HTTP 请求发生在UI线程之外、内部采用了线程池来处理并发请求,而且它使用起来比HttpClient更加简便。
9. 配置Tomcat服务器
在webapps/Root文件夹下:JSON文件和images文件夹
10.JSON文件
http://www.qqe2.com/ json在线编辑器
11.运行效果图
相关文章推荐
- 《『若水新闻』客户端开发教程》——07.升级新闻内容UI
- 浅谈新闻客户端--渠道为王,产品如何制胜?
- Android精品源码,微信红包动画动画效果库输入框风格新闻客户端组件化方案
- 《『若水新闻』客户端开发教程》——09.代码编写(1)
- 指令汇B新闻客户端开发(五) ShareSdk的使用
- 《『若水新闻』客户端开发教程》——13.代码编写(5)
- [Android Exercise]Fragment新闻客户端例子拆解PART.2—带你记忆Fragment的使用
- 模仿新闻客户端的分类滚动视图
- 一个私人定制新闻客户端(MVVM )(源码)
- android 学习随笔九(网络:简单新闻客户端实现)
- [安卓]新闻客户端(六) 主页面之slidingMenu & fragment(4)
- 简单仿照主流新闻客户端界面一(基本框架搭建)
- Android 网页抓取(实现新闻客户端)
- Android 网页抓取(实现新闻客户端)
- Android新闻客户端开发4--显示新闻详细内容业务逻辑实现
- android新闻客户端(一)
- 微信小程序(应用号)开发新闻客户端实例
- 基于Android的小巫新闻客户端开发--UI设计(主界面)
- 网易、腾讯、新浪手机新闻客户端横向对比评测
- Android-新闻客户端