首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从网站XML数据动态填充列表视图

从网站XML数据动态填充列表视图
EN

Stack Overflow用户
提问于 2015-06-18 17:38:46
回答 1查看 245关注 0票数 0

在我的主屏幕(主要活动)中,我有一个列表视图,名为lv

我有一个单独的方法,在MainActivity.java中创建,它返回从解析的XML数据派生的String列表。见下文:

代码语言:javascript
运行
复制
public static List<String> getLocs(){

    List<String> sts = new ArrayList<String>();

    try {

        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();


        Document doc = docBuilder.parse(new URL("http://api.irishrail.ie/realtime/realtime.asmx/getAllStationsXML_WithStationType?StationType=D").openStream());

        doc.getDocumentElement().normalize();

        NodeList stationames = doc.getElementsByTagName("objStation");

        for(int i = 0; i<stationames.getLength(); i++){

            Element firstStat = (Element) stationames.item(i);
            Element stationalias = (Element) firstStat.getElementsByTagName("StationDesc").item(0);

            sts.add(stationalias.getTextContent().trim());

        }



    } catch (SAXParseException err) {

        System.out.println("** Parsing error" + ", line "
                + err.getLineNumber() + ", uri " + err.getSystemId());
        System.out.println(" " + err.getMessage());

    } catch (SAXException e) {

        Exception x = e.getException();
        ((x == null) ? e : x).printStackTrace();

    } catch (Throwable t) {
        t.printStackTrace();

    }

    return sts;

}

无论是否有连接,我都有以下方法:

代码语言:javascript
运行
复制
public void checkConnection(View view) {

    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        Toast.makeText(getApplicationContext(), "YAY! Connected !", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Uh oh... problems connecting", Toast.LENGTH_SHORT).show();
    }
}

当单击主活动中的按钮时,将调用此方法。最重要的是,它成功地运行着,"YAY!Connected !“所以确实有联系。

我的主活动类包含以下变量和下面的onCreate()方法,不包括我前面提到的checkConnection按钮。

代码语言:javascript
运行
复制
public class MainActivity extends ActionBarActivity {

ListView lv;
List<String> stnames  = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

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

    stnames = getLocs();

    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            stnames );

    lv.setAdapter(arrayAdapter);

如您所见,这就是我试图使用getLoc()方法返回的列表作为列表视图的适配器的参数填充列表视图的地方。

但是,在调试时,发现stnames列表是空的,因此getLoc()方法无法工作,尽管它在Eclipse中完全独立工作。

所以我想这和Android有关。

有人向我提过,我可能要在另一个班做任何互联网连接。

这个类必须扩展ASync吗?我以为这只是为了并发线程?这可能会回答我关于动态列表填充的连接。

但是,我的程序是否仍然工作,而不声明一个单独的类扩展ASync?

如果是这样的话,为什么我的列表视图不被填充?

谢谢您提前提供帮助!

编辑

我已将以下方法添加到我的MainActivity类中,并为该类声明了全局arrayAdapter

代码语言:javascript
运行
复制
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        stnames = getLocs();
        return null;

    }

    @Override
    protected void onPostExecute(String result) {

        arrayAdapter = new ArrayAdapter<String>(
                MainActivity.this,
                android.R.layout.simple_list_item_1,
                stnames );

        lv.setAdapter(arrayAdapter);
        arrayAdapter.notifyDataSetChanged();

    }
}

但还是没有运气

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 17:58:32

首先,您需要在一个单独的线程中运行您的网络请求,就像@Jones一样,尝试创建一个扩展AsyncTask的类,然后在doInBackground()中放置getLocs()方法。别忘了把互联网许可添加到你的声明中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30922111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档