gpt4 book ai didi

java - 从网站 XML 数据动态填充 ListView Android

转载 作者:行者123 更新时间:2023-12-01 11:24:44 24 4
gpt4 key购买 nike

在我的主屏幕(主要 Activity )中,我有一个 ListView ,名为 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;

}

我有以下方法,无论我是否有连接,都会进行Toasts:

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

当单击主 Activity 中的按钮时,将调用此方法。重要的是它成功运行并 toast ,“YAY!已连接!”。所以确实有联系。

我的 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() 方法返回的列表作为 ListView 适配器的参数来填充 ListView 。

然而,在调试时,结果发现 stnames 列表为空,因此 getLoc() 方法无法工作,尽管它在 Eclipse 中可以完美地工作.

所以我认为这与 Android 有关。

有人向我提到我可能必须在不同的类(class)进行任何互联网连接。

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

但是如果不声明扩展 ASync 的单独类,我的程序是否仍然可以工作?

如果是这样,为什么我的 ListView 没有被填充?

感谢您提前提供的任何帮助!

编辑

我已将以下方法添加到我的 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();

}
}

还是没有运气

最佳答案

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

关于java - 从网站 XML 数据动态填充 ListView Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30922111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com