我正在尝试使用SAX解析器从XML中提取数据。我在Async任务中实现了SAX解析器。当我正在为谷歌眼镜开发时,列表视图中的android代码与卡相比并不是用户友好的。
如何将解析后的信息显示在卡片上以及卡片的创建位置?我尝试将它们包含在异步任务中,但它失败了。
ActivityClass
public class Dpublic class DpadInputActivity extends Activity {
ListView lvPcsPost;
private List<PostValue> mCards;
private CardScrollView mCardScrollView;
private Context context;
static ArrayList<PostValue> postValueArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
createCards();
mCardScrollView = new CardScrollView(this);
PostBaseAdapter adapter = new PostBaseAdapter(context, mCards);
mCardScrollView.setAdapter(adapter);
mCardScrollView.activate();
setContentView(mCardScrollView);
setContentView(R.layout.activity_main1);
new PostAsync().execute();
}
class PostAsync extends AsyncTask<Void, Void, Void> {
ProgressDialog pd;
XMLHelper helper;
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(DpadInputActivity.this, "xx", "Loading
posts ...", true, false);
}
//reading and parsing
@Override
protected Void doInBackground(Void... arg0) {
helper = new XMLHelper();
helper.get();
postValueArrayList = helper.getPostsList();
return null;
}
@Override
protected void onPostExecute(Void result) {
PostBaseAdapter postBaseAdapter = new
PostBaseAdapter(DpadInputActivity.this, postValueArrayList);
lvPcsPost.setAdapter(postBaseAdapter);
pd.dismiss();
}
}
private void createCards() {
mCards = new ArrayList<PostValue>();
for (int i = 0; i < postValueArrayList.size(); i++) {
mCards.add(postValueArrayList.get(i));
}
}
}
XML Helper Class
public class XMLHelper extends DefaultHandler{
private String URL_MAIN = "blabla.xml";
String TAG = "XMLHelper";
Boolean currTag = false;
String currTagVal = "";
private PostValue post = null;
private ArrayList<PostValue> posts = new ArrayList<PostValue>();
public ArrayList<PostValue> getPostsList() {
return this.posts;
}
public void get() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser mSaxParser = factory.newSAXParser();
XMLReader mXmlReader = mSaxParser.getXMLReader();
mXmlReader.setContentHandler(this);
InputStream mInputStream = new URL(URL_MAIN).openStream();
mXmlReader.parse(new InputSource(mInputStream));
} catch (Exception e) {
// Exceptions can be handled for different types
// But, this is about XML Parsing not about Exception Handling
Log.e(TAG, "Exception: " + e.getMessage());
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currTag) {
currTagVal = currTagVal + new String(ch, start, length);
currTag = false;
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "TAG: " + localName);
currTag = true;
currTagVal = "";
if (localName.equals("marker"))
post = new PostValue();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currTag = false;
if (localName.equalsIgnoreCase("location")) //post_title
post.setLocation(currTagVal);
else if (localName.equalsIgnoreCase("devt_type")) //guild
post.setType(currTagVal);
else if (localName.equalsIgnoreCase("gpr")) //post_date
post.setGpr(currTagVal);
else if (localName.equalsIgnoreCase("marker")) //end of tag; adding object to list
posts.add(post);
}
}
由于某些原因,我保留了XML的机密信息。
答案 0 :(得分:0)
如果要在AsyncTask中提取数据并希望在UI上显示数据,则需要返回信息。您无法从AsyncTask内部访问UI线程。
至于卡的实际构建,您需要创建一个实现CardScrollAdapter的类。您需要覆盖getView方法,然后使用传递到适配器的数据填充视图。请务必同时查看ViewHolders。