【Android学习】第六章 · 创建一个新闻客户端

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/52748529

Xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<news>

-<new>

<title>住房养老热点问题</title>

<body>这是我要显示的第一个问题</body>

<talk>1次</talk>

<image>http://169.254.113.102:8080/image/1.jpg</image>

</new>

-<new>

<title>养育子女热点问题</title>

<body>这是我要显示的第二个问题</body>

<talk>2次</talk>

<image>http://169.254.113.102:8080/image/2.jpg</image>

</new>

-<new>

<title>拆迁房热点问题</title>

<body>这是我要显示的第三个问题</body>

<talk>3次</talk>

<image>http://169.254.113.102:8080/image/3.jpg</image>

</new>

-<new>

<title>服务热点问题</title>

<body>这是我要显示的第四个问题</body>

<talk>4次</talk>

<image>http://169.254.113.102:8080/image/1.jpg</image>

</new>

-<new>

<title>热点问题</title>

<body>这是我要显示的第五个问题</body>

<talk>5次</talk>

<image>http://169.254.113.102:8080/image/2.jpg</image>

</new>

-<new>

<title>没有热点问题</title>

<body>这是我要显示的第六个问题</body>

<talk>6次</talk>

<image>http://169.254.113.102:8080/image/3.jpg</image>

</new>

</news>

首先需要解析指定的xml文件这里注意:使用XmlPullParser分析器

先指定输入流的编码

parser.setInput(is, "UTF-8");

接着获取当前指针位置的数据类型

int type = parser.getEventType();

当指针没有读取到文件末尾

while(type != XmlPullParser.END_DOCUMENT)

就一直循环解析

注意你找到想要的节点的内容需要将指针往后移动,而且在读取完一段数据需要将生成的添加到list中

代码如下:

public final class analyzeXml{

public static List<news> newslist;

public void read(InputStream is){

XmlPullParser parser = Xml.newPullParser();

try {

System.out.println("分析is中");

parser.setInput(is, "UTF-8");

news news = null;

int type = parser.getEventType();

while(type != XmlPullParser.END_DOCUMENT){

switch (type) {

case XmlPullParser.START_TAG:

if("news".equals(parser.getName())){

newslist = new ArrayList<news>();

}else if("title".equals(parser.getName())){

news.title = parser.nextText();

}else if("image".equals(parser.getName())){

news.image = parser.nextText();

}else if("talk".equals(parser.getName())){

news.talk = parser.nextText();

}else if("body".equals(parser.getName())){

news.body = parser.nextText();

}else if("new".equals(parser.getName())){

news = new news();

}

break;

case XmlPullParser.END_TAG:

if("new".equals(parser.getName())){

newslist.add(news);

}

break;

}

type=parser.next();

}

System.out.println("分析is结束");

} catch (Exception e) {

e.printStackTrace();

}

}



}

 

注:list对象需要new出来不然无法使用!!!

在主线程保证数据读取完再刷新ui方法1:

public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        readThread thread = new readThread();

        thread.start();

        try {

thread.join();

} catch (Exception e) {

}

        ListView lv = (ListView)findViewById(R.id.lv);

        lv.setAdapter(new myadapter());

}

 

 

利用thread.join实现

方法二:

ListView lv = (ListView)findViewById(R.id.lv);

lv.setAdapter(new myadapter());

写在handler内,解析完成后通过发送消息刷新ui 

Handler handler = new Handler(){

public void handleMessage(android.os.Message msg) {

ListView lv = (ListView) findViewById(R.id.lv);

lv.setAdapter(new MyAdapter());

}

};

 

此时注意再次优化

之前我们介绍了在打开listview系统自动缓存view对象

 

这里的缓存个人理解是将布局文件转化为view对象是个耗费资源的方法,每次调用都会耗费大量资源。当有系统缓存我们可以将之前获取的缓存convertview直接赋值给view这样可以减少解析这一步骤

 

view = inflater.inflate(R.layout.mylayout,  null);

 

进一步优化做的是将获取布局文件中的组件也进行缓存,达到进一步省时省资源

 

自定义一个内部类ViewHolder

class ViewHolder{

TextView title;

TextView body;

TextView talk;

ImageView iv;

}

 

在判断完是否有缓存之后,如果没有就将获取到的组件保存至ViewHolder里面,再通过view的setTag方法缓存ViewHolder

在系统有了缓存后,直接拿出view里的tag强转为ViewHolder对象,再进行设置

 

public View getView(int position, View convertView, ViewGroup parent) {

news news = analyzeXml.newslist.get(position);

View view = null;

ViewHolder mHolder = null;

LayoutInflater inflater = LayoutInflater.from(MainActivity.this);

if(convertView==null){

view = inflater.inflate(R.layout.mylayout,  null);



mHolder = new ViewHolder();

mHolder.iv = (ImageView)view.findViewById(R.id.iv);

mHolder.body = (TextView)view.findViewById(R.id.body);

mHolder.talk = (TextView)view.findViewById(R.id.talk);

mHolder.title = (TextView)view.findViewById(R.id.title);



//把一个对象存到view里面,最后return的view里面有viewHolder

view.setTag(mHolder);

}

else{

view = convertView;

mHolder = (ViewHolder)view.getTag();

}

imageThread thread = new imageThread(position, getCacheDir().toString());

thread.start();

try {

thread.join();

} catch (Exception e) {

}

mHolder.iv.setImageBitmap(thread.bm);

mHolder.title.setText(news.title);

mHolder.body.setText(news.body);

mHolder.talk.setText(news.talk);

return view;

}

插一句布局文件activity_main.xml内只要listview对象

需要添加的布局自己新建在adapter中用布局文件解析器LayoutInflater解析为view对象就好

最后成果

 

猜你喜欢

转载自blog.csdn.net/iceSony/article/details/52748529