在我的主屏幕(主要活动)中,我有一个名为lv
的列表视图。
我有一个单独的方法,在MainActivity.java中创建,它返回一个从解析的XML数据派生的字符串List。见下文:
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;
}
我有以下方法:Toast我是否有连接:
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();
}
}
单击主活动中的按钮时,将调用此方法。重要的是它成功地烘烤,#34; YAY!连接!&#34;。确实存在联系。
My 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()方法中返回的List作为列表视图的适配器的参数来填充列表视图。
然而,在调试时,事实证明stnames
列表是空的,因此getLoc()
方法无法工作,尽管它在Eclipse中完全适用于它。
所以我认为它与Android有关。
有人提到我可能需要在不同的班级进行任何互联网连接。
这个类是否必须扩展ASync?我以为这只是并发线程?这可能应该回答我关于动态列表填充的连接。
但是,如果我的程序仍然可以工作而不声明一个单独的类扩展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();
}
}
但仍然没有运气
答案 0 :(得分:1)
首先,你需要在像AsyncTask这样的单独线程中运行你的网络请求,比如@Jones说,尝试创建一个扩展AsyncTask的类,然后在doInBackground()中放置你的getLocs()方法。别忘了将INTERNET权限添加到您的清单中。