简单地说,我从“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/