java - ArrayList 中的数据到 Listview 中

标签 java android listview arraylist

简单地说,我从“HandleXML”类(称为表单 MainActivity)中的外部 RSS XML 检索数据,将其解析/存储在 ArrayList 中,然后将其输出到 Listview。我知道需要一个适配器才能将 ArrayList 值获取到 Listview,但由于某种原因或其他原因,我不会比将数据解析到 ArrayList 更进一步。 我想我拥有所有组件,也许只是位置不正确?

[编辑] 为了澄清,当按下 Activity 中的任一按钮时,logcat 会报告 HandleXML.printItems 的空异常。 ArrayList 似乎已被填充,但 Listview 中没有出现任何内容。

*如果它看起来像家庭作业,那么这是别人的,我正在用它来学习。我是业余爱好者而不是学生。

感谢任何帮助。

MainActivity.java

//define buttons
        b1=(Button)findViewById(R.id.b1);
        b2=(Button)findViewById(R.id.b2);

        //on-click listeners for buttons; retrieve XML info
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                obj = new HandleXML(roadsURL);
                obj.fetchXML();
            }
        });

        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                obj = new HandleXML(proadsURL);
                obj.fetchXML();
            }
        });

HandleXML.java

public class HandleXML extends Activity {

    private static final String TAG = HandleXML.class.getSimpleName(); //Logcat tag for debugging
    private String urlString = null;
    private XmlPullParserFactory xmlFactoryObject;

    public HandleXML(String url){
        this.urlString = url;
    }

    public void parseXMLAndStoreIt(XmlPullParser myParser) {
        int event;
        ArrayList<Item> items = new ArrayList(); //arraylist for item objects
        String text = null;
        Item currentItem = null;

        try {
            event = myParser.getEventType(); //return event type from XML

            while (event != XmlPullParser.END_DOCUMENT) {
                String name = null;

                switch (event){
                    case XmlPullParser.START_DOCUMENT:
                        break;

                    case XmlPullParser.START_TAG: //parse by item tag, then by sub-tags
                        name = myParser.getName();
                        if (name.equals("item")){
                            currentItem = new Item(); //new item object for arraylist
                        } else if (currentItem != null){
                            if (name.equals("title")){
                                currentItem.title = text;
                            } else if (name.equals("description")){
                                currentItem.description = text;
                            } 
                        }
                        break;

                    case XmlPullParser.TEXT:
                        text = myParser.getText(); //retrieve text value from tag
                        break;

                    case XmlPullParser.END_TAG:

                        name = myParser.getName();
                        if (name.equalsIgnoreCase("item") && currentItem != null) {
                            items.add(currentItem); //add to arraylist
                            //Log.e(TAG, "parse: added new item "); //DEBUG - print the code to logcat
                        }
                }

                event = myParser.next();
            }
            printItems(items); //get arraylist info to screen
        }

        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void printItems(ArrayList<Item> items)
    {
        ListView lv = (ListView)findViewById(R.id.info); //scroll area listview

        //adapter with pre-defined layout for listview, source arraylist
        ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(this, android.R.layout.simple_list_item_2 , items);
        lv.setAdapter(adapter); //link adapter to listview
    }

    public void fetchXML(){
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {

                try {
                    URL url = new URL(urlString);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    //HttpURLConnection settings
                    conn.setReadTimeout(10000 /* milliseconds */);
                    conn.setConnectTimeout(15000 /* milliseconds */);
                    conn.setAllowUserInteraction(false);
                    conn.setInstanceFollowRedirects(true);
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);

                    // Starts the query
                    conn.connect();
                    InputStream stream = conn.getInputStream();

                    xmlFactoryObject = XmlPullParserFactory.newInstance();
                    XmlPullParser myparser = xmlFactoryObject.newPullParser();

                    myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                    myparser.setInput(stream, null); //set XML source as stream

                    parseXMLAndStoreIt(myparser);
                    stream.close();
                }

                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}

最佳答案

我认为您应该考虑为此使用异步任务,因为您可以比标准线程更精确地控制数据流。您可以传入对 ListView 的引用并在 onPostExecute()

中更新它

考虑一下:

        //on-click listeners for buttons; retrieve XML info
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadFilesTask(listview_item_or_adapter_reference).execute(roadsURL);
            }
        });


 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

     private static final String TAG = HandleXML.class.getSimpleName();                 
     //Logcat tag for debugging
     private String urlString = null;
     private XmlPullParserFactory xmlFactoryObject;
     private ListView item;

     public DownloadFilesTask(ListView item){
     this.item = item;
     }

     protected String doInBackground(URL... urls) {
 try {
                    URL url = new URL(urlString);
                    HttpURLConnection conn = (HttpURLConnection) 
                    url.openConnection();
                    //HttpURLConnection settings
                    conn.setReadTimeout(10000 /* milliseconds */);
                    conn.setConnectTimeout(15000 /* milliseconds */);
                    conn.setAllowUserInteraction(false);
                    conn.setInstanceFollowRedirects(true);
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);

                    // Starts the query
                    conn.connect();
                    InputStream stream = conn.getInputStream();

                    xmlFactoryObject = XmlPullParserFactory.newInstance();
                    XmlPullParser myparser = xmlFactoryObject.newPullParser();

                    myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                    myparser.setInput(stream, null); //set XML source as stream


                    stream.close();
                }

                catch (Exception e) {
                    e.printStackTrace();
                }
         return totalSize;
     }

     protected void onPostExecute(String result) {
         showDialog("Downloaded  data,pasring now...");
         parseXMLAndStoreIt(myparser);
         //update item or adapter here
     }






       private void printItems(ArrayList<Item> items)
    {
        ListView lv = (ListView)findViewById(R.id.info); //scroll area listview

        //adapter with pre-defined layout for listview, source arraylist
        ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(this, android.R.layout.simple_list_item_2 , items);
        lv.setAdapter(adapter); //link adapter to listview
    }

      public void parseXMLAndStoreIt(XmlPullParser myParser) {
        int event;
        ArrayList<Item> items = new ArrayList(); //arraylist for item objects
        String text = null;
        Item currentItem = null;

        try {
            event = myParser.getEventType(); //return event type from XML

            while (event != XmlPullParser.END_DOCUMENT) {
                String name = null;

                switch (event){
                    case XmlPullParser.START_DOCUMENT:
                        break;

                    case XmlPullParser.START_TAG: //parse by item tag, then by sub-tags
                        name = myParser.getName();
                        if (name.equals("item")){
                            currentItem = new Item(); //new item object for arraylist
                        } else if (currentItem != null){
                            if (name.equals("title")){
                                currentItem.title = text;
                            } else if (name.equals("description")){
                                currentItem.description = text;
                            } 
                        }
                        break;

                    case XmlPullParser.TEXT:
                        text = myParser.getText(); //retrieve text value from tag
                        break;

                    case XmlPullParser.END_TAG:

                        name = myParser.getName();
                        if (name.equalsIgnoreCase("item") && currentItem != null) {
                            items.add(currentItem); //add to arraylist
                            //Log.e(TAG, "parse: added new item "); //DEBUG - print the code to logcat
                        }
                }

                event = myParser.next();
            }
            printItems(items); //get arraylist info to screen
        }

        catch (Exception e) {
            e.printStackTrace();
        }
    }

 }

关于java - ArrayList 中的数据到 Listview 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36160443/

相关文章:

Android 数据绑定(bind)会吞噬来自其他编译器的错误

java - 如何在java中调用重载方法

java - 使用 Java 将数据插入 mySQL DB 时出错

java - 使用 JDBC 从 Java 连接到 Hive

android - 对于 Android 应用程序来说,多少字符串太多了

android - Google Play 测试版应用不在主屏幕上

javascript - 点击按钮后如何将 ListView 向下滚动到底部(例如使用 scrollToIndex )? NativeScript-Vue

android - 修复 android 和 iOS 原生 react 中的行数

android - 如何为 ListView 中的每一行设置不同的背景颜色?

java - 在java中使用for循环打印链表