我正在学习如何在Android中解析xml文档。我有完整的XML解析源代码,但它在Console上显示输出。但是我想在ListView中显示结果数据我不知道如何将数据显示到listview中。你能否帮我解决这个问题。我在这里提供完整的源代码。 MainActivity.java
public class MainActivity extends Activity {
private ProgressDialog pDialog;
private ItemXMLHandler myXMLHandler;
private String rssFeed = "https://www.dropbox.com/s/t4o5wo6gdcnhgj8/imagelistview.xml?dl=1";
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textview =(TextView)findViewById(R.id.textView1);
}
public void doParsing(View v)
{
if (isNetworkAvailable())
{
textview.setText("Loading...Please wait...");
new AsyncData().execute(rssFeed);
}
else
{
showToast("No Network Connection!!!");
}
}
class AsyncData extends AsyncTask<String, Void, Void>
{
@Override
protected void onPreExecute()
{
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("Loading....");
pDialog.setMessage("Please wait...");
pDialog.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(String... params)
{
try
{
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
myXMLHandler = new ItemXMLHandler();
xr.setContentHandler(myXMLHandler);
URL _url = new URL(params[0]);
xr.parse(new InputSource(_url.openStream()));
} catch (ParserConfigurationException pce)
{
Log.e("SAX XML", "sax parse error", pce);
} catch (SAXException se)
{
Log.e("SAX XML", "sax error", se);
} catch (IOException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
textview.setText("Done!!!");
if (pDialog != null && pDialog.isShowing())
{
pDialog.dismiss();
}
ArrayList<Bean> itemsList = myXMLHandler.getItemsList();
//ArrayList<String> temp=new ArrayList<String>();
if (null != itemsList && itemsList.size() != 0)
{
for (int index = 0; index < itemsList.size(); index++)
{
Bean objBean = itemsList.get(index);
/*System.out.println(">>>>>>>>>>>>>>>" + index);
System.out.println("ID :: " + objBean.getId());
System.out.println("TITLE :: " + objBean.getTitle());
System.out.println("DESC :: " + objBean.getDesc());
System.out.println("PUBDATE :: " + objBean.getPubDate());
System.out.println("LINK :: " + objBean.getLink());*/
// Store values in ArrayList and Pass to the Customer Adapter class
}
}
}
}
public void showToast(String msg)
{
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
}
public boolean isNetworkAvailable()
{
ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null)
{
return false;
}
else
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
{
for (int i = 0; i < info.length; i++)
{
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
return false;
}
}
XmlHandlerclass
public class ItemXMLHandler extends DefaultHandler {
Boolean currentElement = false;
String currentValue = "";
Bean item = null;
private ArrayList<Bean> itemsList = new ArrayList<Bean>();
public ArrayList<Bean> getItemsList()
{
return itemsList;
}
// Called when tag starts
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
currentElement = true;
currentValue = "";
if (localName.equals("item"))
{
item = new Bean();
}
}
// Called when tag closing
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
currentElement = false;
if (localName.equals("id"))
{
item.setId(currentValue);
} else if (localName.equals("title"))
{
item.setTitle(currentValue);
} else if (localName.equals("desc"))
{
item.setDesc(currentValue);
} else if (localName.equals("pubDate"))
{
item.setPubDate(currentValue);
} else if (localName.equals("link"))
{
item.setLink(currentValue);
} else if (localName.equals("item"))
{
itemsList.add(item);
}
}
// Called to get tag characters
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
if (currentElement)
{
currentValue = currentValue + new String(ch, start, length);
}
}
}
存储数据的BeanClass
public class Bean {
private String id;
private String title;
private String desc;
private String pubDate;
private String link;
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 getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPubDate() {
return pubDate;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
答案 0 :(得分:3)
您需要一个列表视图
在你的main.xml中有ListView。自定义您想要的方式。
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
>
</ListView>
将ListView声明为类成员
ListView lv;
然后在MainActivity onCreate
中初始化ListView
lv = (ListView) findViewById(R.id.listView1);
在onPostExecute
ArrayList<Bean> itemsList = myXMLHandler.getItemsList();
lv.setAdapter(new CustomAdapter(MainActivity.this,itemsList));
有一个row.xml。根据您的要求进行定制。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="17dp"
/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/textView2"
android:layout_marginTop="26dp"
/>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginTop="24dp"
/>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView3"
android:layout_below="@+id/textView3"
android:layout_marginTop="23dp"
/>
</RelativeLayout>
Then your CustomAdapter
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
class CustomAdapter extends BaseAdapter
{
Context mContext;
ArrayList<Bean> beandata;
LayoutInflater mInflater;
public CustomAdapter(Context context,ArrayList<Bean> itemList)
{
mContext = context;
beandata = itemList;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return beandata.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder vh;
if(convertView == null)
{
vh= new ViewHolder();
convertView = mInflater.inflate(R.layout.row,
parent, false);
vh.tv1 = (TextView) convertView.findViewById(R.id.textView1);
vh.tv2 = (TextView) convertView.findViewById(R.id.textView2);
vh.tv3 = (TextView) convertView.findViewById(R.id.textView3);
vh.tv4 = (TextView) convertView.findViewById(R.id.textView4);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
Bean objBean = beandata.get(position);
vh.tv1.setText(objBean.getTitle());
vh.tv2.setText(objBean.getDesc());
vh.tv3.setText(objBean.getPubDate());
vh.tv4.setText(objBean.getLink());
return convertView;
}
static class ViewHolder
{
TextView tv1,tv2,tv3,tv4;
}
}
您应该使用自定义适配器的列表视图。对于listview中的每一行,都会为自定义布局充气。 Listview回收视图。
为了平滑滚动和表演,请使用视图持有者
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
最好使用谷歌推荐的xmlpullparser
http://developer.android.com/training/basics/network-ops/xml.html
快照。您需要根据您的要求定制ui。