Xml文件内容如下:
-
-
住房养老热点问题
这是我要显示的第一个问题
1次
http://169.254.113.102:8080/image/1.jpg
-
养育子女热点问题
这是我要显示的第二个问题
2次
http://169.254.113.102:8080/image/2.jpg
-
拆迁房热点问题
这是我要显示的第三个问题
3次
http://169.254.113.102:8080/image/3.jpg
-
服务热点问题
这是我要显示的第四个问题
4次
http://169.254.113.102:8080/image/1.jpg
-
热点问题
这是我要显示的第五个问题
5次
http://169.254.113.102:8080/image/2.jpg
-
没有热点问题
这是我要显示的第六个问题
6次
http://169.254.113.102:8080/image/3.jpg
首先需要解析指定的xml文件这里注意:使用XmlPullParser分析器
先指定输入流的编码
parser.setInput(is, "UTF-8");
接着获取当前指针位置的数据类型
int type = parser.getEventType();
当指针没有读取到文件末尾
while(type != XmlPullParser.END_DOCUMENT)
就一直循环解析
注意你找到想要的节点的内容需要将指针往后移动,而且在读取完一段数据需要将生成的添加到list中
代码如下:
public final class analyzeXml{
public static List 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();
}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对象就好
最后成果