【问题标题】:Dynamically populating List View from Website XML data Android从网站 XML 数据 Android 动态填充列表视图
【发布时间】:2015-06-18 17:38:46
【问题描述】:

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

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

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;

}

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

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

当单击 Main Activity 中的按钮时调用此方法。重要的是它成功运行,“YAY!Connected!”。所以确实有联系。

我的 Main Activity 类包含以下变量和以下 onCreate() 方法,不包括我上面提到的 checkConnection 按钮。

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 List 是空的,因此 getLoc() 方法无法工作,尽管它在 Eclipse 中完美地工作。

所以我认为这与 Android 有关。

有人向我提到,我可能需要在不同的班级进行任何互联网连接。

这个类是否必须扩展异步?我以为这只是为了并发线程?这应该可以回答我关于动态列表填充的连接。

但是我的程序是否应该在不声明扩展 ASync 的单独类的情况下仍然工作?

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

提前感谢您的帮助!

编辑

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

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();

    }
}

仍然没有运气

【问题讨论】:

  • 尝试将 getLocs() 方法放在活动的子类中,并使该子类扩展异步任务。我猜你有一个 NetworkOnMainThreadException

标签: java android xml eclipse networking


【解决方案1】:

首先,您需要在单独的线程中运行您的网络请求,例如 AsyncTask,就像 @Jones 所说的,尝试创建一个扩展 AsyncTask 的类,然后在 doInBackground() 中放入您的 getLocs() 方法。不要忘记将 INTERNET 权限添加到您的 Manifest。

【讨论】:

  • 我在覆盖的 doInBackground() 方法中返回什么字符串值。我可以只返回一个随机字符串,然后在里面运行我的getLoc() 方法吗?
  • 并且doInBackground()方法会在应用程序启动时自动调用,还是需要我在Main Activity或onCreate()方法中运行一些其他命令?
  • 已修复,忘记执行
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2014-11-15
  • 1970-01-01
相关资源
最近更新 更多