2

我正在学习如何在 Android 中解析 xml 文档。我有完整的 XML 解析源代码,但它在控制台上显示输出。但我想在 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;
    }
}

XmlHandler 类

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;
    }

}
4

1 回答 1

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 回收视图。

为了平滑滚动和性能,请使用视图支架

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

最好使用谷歌推荐的 xmlpullparser

http://developer.android.com/training/basics/network-ops/xml.html

快照。您需要根据您的要求自定义 ui。

在此处输入图像描述

于 2013-08-29T07:59:12.313 回答