• Ace教你一步一步做Android新闻客户端(一)


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

    手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的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  图片暂用系统默认 明天发图片异步加载和优化的文再讲 

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="horizontal"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:padding="0dp">
     7     <ImageView
     8         android:id="@+id/tvimage"
     9         android:layout_width="64dp"
    10         android:layout_height="64dp"
    11         android:src="@mipmap/ic_launcher" />
    12 
    13 
    14  <LinearLayout
    15         android:layout_width="match_parent"
    16         android:layout_height="match_parent"
    17         android:orientation="vertical"
    18         android:padding="0dp">
    19 
    20     <TextView
    21         android:layout_width="283dp"
    22         android:layout_height="wrap_content"
    23         android:singleLine="true"
    24         android:id="@+id/tvtitle"
    25         android:text="这是标题"
    26         android:paddingLeft="5dp"
    27         android:textSize="20sp"/>
    28 
    29     <TextView
    30         android:layout_width="262dp"
    31         android:layout_height="wrap_content"
    32         android:maxLines="3"
    33         android:id="@+id/tvcontent"
    34         android:text="这是内容"
    35         android:paddingTop="2dp"
    36         android:paddingLeft="5dp"
    37         android:textSize="12dp"
    38         />
    39  </LinearLayout>
    40 </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;
    }

    先就这样回来补上效果图

  • 相关阅读:
    Socket通信
    浏览器调用打印机
    python dict操作
    python list操作
    python 模块Example链接
    python random模块
    python configparser模块
    python unittest模块
    python timeit模块
    python datetime模块
  • 原文地址:https://www.cnblogs.com/AceIsSunshineRain/p/5145836.html
Copyright © 2020-2023  润新知