从异步任务显示卡上的详细信息

时间:2015-06-11 03:38:45

标签: xml asynchronous google-glass google-gdk

我正在尝试使用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的机密信息。

1 个答案:

答案 0 :(得分:0)

如果要在AsyncTask中提取数据并希望在UI上显示数据,则需要返回信息。您无法从AsyncTask内部访问UI线程。

至于卡的实际构建,您需要创建一个实现CardScrollAdapter的类。您需要覆盖getView方法,然后使用传递到适配器的数据填充视图。请务必同时查看ViewHolders。