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

首先我们先看一下要模拟的界面

我们主要实现的就是ListView解析json文件中的数据,UI布局很简单不做赘述。 这里我们需要一个服务器来实现数据的动态更新, 这里我们用到的是Tomcat8.0。 首先我们把需要解析的json文件放置到Tomcat的webapp文件下的ROOT里面,方便我们解析。

首先我们创建一个JsonParse类用来解析json文件:

package cn.edu.bzu.myapplication.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.myapplication.entity.NewsInfo;/** * Created by Becauseshy on 2017/5/18. */public class JsonParse { public static List<NewsInfo> getNewInfo(String json){  Gson gson=new Gson();  Type listType=new TypeToken<List<NewsInfo>>(){  }.getType();  List<NewsInfo> newsInfos=gson.fromJson(json,listType);  return newsInfos; }}

创建json文件的实体类:

package cn.edu.bzu.myapplication.entity;/** * Created by Becauseshy on 2017/5/17. */public class NewsInfo { private String iconPath; private String title; private String description; private int type; private long comment; public String getIconPath() {  return iconPath; } public void setIconPath(String iconPath) {  this.iconPath = iconPath; } 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; }}

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" /> </FrameLayout></LinearLayout>

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: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>

适配器代码:

package cn.edu.bzu.myapplication.adapter;/** * Created by Becauseshy on 2017/5/17. */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 java.util.List;import cn.edu.bzu.myapplication.R;import cn.edu.bzu.myapplication.entity.NewsInfo;public class NewAdapter extends ArrayAdapter<NewsInfo>{private int resourceID; public NewAdapter(Context context, int resource, List<NewsInfo> objects) {  super(context, resource, objects);  resourceID=resource; } @Override public View getView(int position, View convertView, ViewGroup parent) {  NewsInfo fruit=getItem(position);  View view;  ViewHolder viewHolder;  if(convertView==null){    view=LayoutInflater.from(getContext()).inflate(resourceID,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(fruit.getIconPath(),R.drawable.a,R.drawable.ic_launcher);  viewHolder.tv_title.setText(fruit.getTitle());  viewHolder.tv_description.setText(fruit.getDescription());  int type=fruit.getType();  switch (type){   case 1:    viewHolder.tv_type.setText("评论:"+fruit.getComment());    viewHolder.tv_type.setTextColor(Color.BLUE);    break;   case 2:    viewHolder.tv_type.setText("专题");    viewHolder.tv_type.setTextColor(Color.BLACK);    break;   case 3:    viewHolder.tv_type.setText("LIVE");    viewHolder.tv_type.setTextColor(Color.RED);    break;  }  return view; } class ViewHolder{  SmartImageView siv;  TextView tv_title;  TextView tv_description;  TextView tv_type; }}

MainActivity实现代码:

package cn.edu.bzu.myapplication;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.ArrayList;import java.util.List;import cn.edu.bzu.myapplication.Tools.JsonParse;import cn.edu.bzu.myapplication.adapter.NewAdapter;import cn.edu.bzu.myapplication.entity.NewsInfo;import cn.edu.bzu.myapplication.model.Fruit;public class MainActivity extends AppCompatActivity { private ListView Iv_news; private NewAdapter newAdapter; private List<NewsInfo> newInfos; private LinearLayout loading; private JsonParse jsonParse; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  Iv_news= (ListView) findViewById(R.id.lv_news);  newAdapter =new NewAdapter(this,R.layout.news_item,newInfos);  loading= (LinearLayout) findViewById(R.id.loading);  prepareData(); } private void prepareData() {  //fruitList=new ArrayList<>();  //Fruit apple=new Fruit("Apple",R.drawable.apple_pic);  // fruitList.add(apple);  AsyncHttpClient asyncHttpClient=new AsyncHttpClient();  asyncHttpClient.get(getString(R.string.serverurl), new AsyncHttpResponseHandler() {   @Override   public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {    try {     String json=new String(bytes,"utf-8");     newInfos=jsonParse.getNewInfo(json);     if(newInfos==null){      Toast.makeText(MainActivity.this,"解析失败",Toast.LENGTH_SHORT).show();     }     else {      loading.setVisibility(View.INVISIBLE);      Iv_news.setAdapter(newAdapter);     }    } catch (UnsupportedEncodingException e) {     e.printStackTrace();    }   }   @Override   public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {    Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_SHORT).show();   }  }); }}

在values文件加下的String.xml文件中添加:

<string name=”serverurl”>http://172.16.26.58:8080/newInfo.xml</string>

最后一定不要忘了添加网络访问权限, 这很重要, 好多同学都犯了这个错误、

这样基本功能就实现了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

然后拍一些美得想哭的照片,留给老年的自己。

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

相关文章:

你感兴趣的文章:

标签云: