XML+Volley的使用

Activity

package com.animee.day21.demo02;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListView;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.animee.day21.MyApp;
import com.animee.day21.R;

import java.util.ArrayList;
import java.util.List;

public class DemoActivity02 extends AppCompatActivity {
    public String TAG = "DemoActivity02";
    private ListView lv;
    private List<BlogBean.Entry> entryList;
    private BlogAdapter adapter;
    private String url = "http://feed.cnblogs.com/blog/sitehome/rss";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo02);
        lv = (ListView) findViewById(R.id.lv_demo02);
//        数据源
        entryList = new ArrayList<>();
//        适配器
        adapter = new BlogAdapter(this,entryList);
        lv.setAdapter(adapter);

//        loadWebData(url);
        loadData(url);

    }
    private void loadData(final String url){
        new AsyncTask<Void,Void,String>(){
            @Override
            protected String doInBackground(Void... params) {
                String content = HttpUtils.getStringContent(url);
                return content;
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if (s!=null&&!s.isEmpty()) {
                    Log.i(TAG, "onPostExecute: ===s=="+s);
                    BlogBean blogBean = ParseXML.readXML(s);
                    entryList.addAll(blogBean.getEntryList());
                    adapter.notifyDataSetChanged();
                }
            }
        }.execute();
    }

    /**
     * 使用volley获取的数据:出现了问题
     * */
    private void loadWebData(String url) {
//        1.请求队列
//        2.请求对象
        StringRequest request =new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.i(TAG, "onResponse: s===="+s);
//                解析数据,并展示
                BlogBean blogBean = ParseXML.readXML(s);
                entryList.addAll(blogBean.getEntryList());
                adapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i(TAG, "onErrorResponse: error====="+volleyError.toString());
            }
        });
//        3.添加请求对象到请求队列当中
        MyApp.getHttpQueue().add(request);
    }
}

HttpUtils下载(因为用Volley下载乱码,所以只能换一种)

package com.animee.day21.demo02;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by Administrator on 2018/1/18.
 */

public class HttpUtils {
    public static String getStringContent(String path){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
            InputStream is = conn.getInputStream();
            int hasRead = 0;
            byte[]buf = new byte[1024];
            while((hasRead = is.read(buf))!=-1){
                baos.write(buf,0,hasRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return baos.toString();
    }
}


XML解析

package com.animee.day21.demo02;

import android.util.Log;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/1/18.
 */

public class ParseXML {
    public static String TAG = "ParseXML";
    public static BlogBean readXML(String content){
        BlogBean blogBean = new BlogBean();
        List<BlogBean.Entry>entryList = new ArrayList<>();
        blogBean.setEntryList(entryList);
//        开始解析
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser pullParser = factory.newPullParser();
            ByteArrayInputStream stream = new ByteArrayInputStream(content.getBytes());
            pullParser.setInput(stream,"utf-8");
            int eventType = pullParser.getEventType();
            BlogBean.Entry entry = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String name = pullParser.getName();
                Log.i(TAG, "readXML: ==name=="+name);
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if (name.equals("entry")) {
                            entry = new BlogBean.Entry();
                        }else if (name.equals("id")) {
                            if (entry!=null) {
                                entry.setId(pullParser.nextText());
                            }
                        }else if (name.equals("title")) {
                            if (entry!=null) {
                                entry.setTitle(pullParser.nextText());
                            }
                        }else if (name.equals("summary")) {
                            entry.setSummary(pullParser.nextText());
                        }else if (name.equals("published")) {
                            entry.setPublished(pullParser.nextText());
                        }else if (name.equals("updated")) {
                            if (entry!=null) {
                                entry.setUpdated(pullParser.nextText());
                            }
                        }else if (name.equals("name")) {
                            entry.setName(pullParser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (name.equals("entry")) {
                            entryList.add(entry);
                        }
                        break;
                }
                eventType = pullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i(TAG, "readXML: ===list.size=="+entryList.size());
        return blogBean;
    }
}
    
ListView的适配器

package com.animee.day21.demo02;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.animee.day21.R;

import java.util.List;

/**
 * Created by Administrator on 2018/1/18.
 */

public class BlogAdapter extends BaseAdapter{
    private Context context;
    private List<BlogBean.Entry>mDatas;

    public BlogAdapter(Context context, List<BlogBean.Entry> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView==null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_lv_demo02,null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        BlogBean.Entry entry = mDatas.get(position);
        holder.titleTv.setText(entry.getTitle());
        holder.summaryTv.setText(entry.getSummary());
        holder.authorTv.setText("作者:"+entry.getName());
        holder.timeTv.setText(entry.getPublished());
        return convertView;
    }

    class ViewHolder{
        TextView titleTv,summaryTv,authorTv,timeTv;
        public ViewHolder(View view){
            titleTv = (TextView) view.findViewById(R.id.item_tv_title);
            summaryTv = (TextView) view.findViewById(R.id.item_tv_summary);
            authorTv = (TextView) view.findViewById(R.id.item_tv_author);
            timeTv = (TextView) view.findViewById(R.id.item_tv_time);
        }
    }
}

实体类

  

package com.animee.day21.demo02;

import java.util.List;

/**
 * Created by Administrator on 2018/1/18.
 * <id>http://www.cnblogs.com/zhangxufeng/p/8308558.html</id>
 <title type="text">数据库索引创建与优化 - 爱宝贝丶</title>
 <summary type="text">
 对于数据库的优化主要包括三个部分:查询优化、索引优化和字段类型优化,其中,索引优化则是数据库优化的重中之重。一个查询使用索引与不使用索引的差别可能只在100个数量级,而一个好的索引与不好的索引差别可能在1000个数量
 </summary>
 <published>2018-01-18T01:24:00Z</published>
 <updated>2018-01-18T01:24:00Z</updated>
 <author>
 <name>爱宝贝丶</name>
 <uri>http://www.cnblogs.com/zhangxufeng/</uri>
 </author>
 <link rel="alternate" href="http://www.cnblogs.com/zhangxufeng/p/8308558.html"/>
 <link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangxufeng/p/8308558.html"/>
 <content type="html">
 【摘要】 对于数据库的优化主要包括三个部分:查询优化、索引优化和字段类型优化,其中,索引优化则是数据库优化的重中之重。一个查询使用索引与不使用索引的差别可能只在100个数量级,而一个好的索引与不好的索引差别可能在1000个数量 <a href="http://www.cnblogs.com/zhangxufeng/p/8308558.html" target="_blank">阅读全文</a>
 </content>
 */

public class BlogBean {

    private List<Entry>entryList;

    public List<Entry> getEntryList() {
        return entryList;
    }

    public void setEntryList(List<Entry> entryList) {
        this.entryList = entryList;
    }

    public BlogBean(List<Entry> entryList) {
        this.entryList = entryList;
    }

    public BlogBean() {
    }

    public static class Entry{
        private String id;
        private String title;
        private String summary;
        private String published;
        private String updated;
        private String name;

        @Override
        public String toString() {
            return "Entry{" +
                    "id='" + id + '\'' +
                    ", title='" + title + '\'' +
                    ", summary='" + summary + '\'' +
                    ", published='" + published + '\'' +
                    ", updated='" + updated + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }

        public Entry() {
        }

        public Entry(String id, String title, String summary, String published, String updated, String name) {
            this.id = id;
            this.title = title;
            this.summary = summary;
            this.published = published;
            this.updated = updated;
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getSummary() {
            return summary;
        }

        public void setSummary(String summary) {
            this.summary = summary;
        }

        public String getPublished() {
            return published;
        }

        public void setPublished(String published) {
            this.published = published;
        }

        public String getUpdated() {
            return updated;
        }

        public void setUpdated(String updated) {
            this.updated = updated;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

    队列
package com.animee.day21;

import android.app.Application;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by Administrator on 2018/1/18.
 */

public class MyApp extends Application{
//  第一步:声明请求队列对象
    private static RequestQueue queue;
    @Override
    public void onCreate() {
        super.onCreate();
        queue = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueue(){
        return queue;
    }
}

   权限

   

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.animee.day21">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name=".MyApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".demo01.DemoActivity01" />
        <activity android:name=".demo02.DemoActivity02"></activity>
    </application>

</manifest>

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.animee.day21.demo02.DemoActivity02">
    <!-- 优化:1.高度避免wrap_content  2.使用convertView  3.使用ViewHolder  4.滑动时不加载图片  5.分页加载-->
    <ListView
        android:id="@+id/lv_demo02"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/colorAccent"
        android:dividerHeight="2dp"></ListView>
</LinearLayout>

子布局

  

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">

    <TextView
        android:id="@+id/item_tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="【算法】赫夫曼树(Huffman)的构建和应用(编码、译码) - 外婆的彭湖湾"
        android:textSize="20sp"/>
    <TextView
        android:id="@+id/item_tv_summary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/item_tv_title"
        android:layout_alignLeft="@+id/item_tv_title"
        android:layout_marginTop="10dp"
        android:padding="10dp"
        android:textColor="@color/colorPrimary"
        android:background="#eee"
        android:text="【算法】赫夫曼树(Huffman)的构建和应用(编码、译码) - 外婆的彭湖湾"
        android:textSize="16sp"/>

    <TextView
        android:id="@+id/item_tv_author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/item_tv_summary"
        android:layout_alignLeft="@+id/item_tv_title"
        android:layout_marginTop="10dp"
        android:text="作者:赫夫曼"
        android:textSize="16sp"/>

    <TextView
        android:id="@+id/item_tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/item_tv_summary"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dp"
        android:text="2018-01-17T22:19:00Z"
        android:textSize="16sp"/>
</RelativeLayout>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值