2013-02-19 72 views
1

我有一個ArticlesAdapter,我正在使用它來讀取遠程JSON數據。適配器正在工作,但我努力讓我的ListView setonitemclicklister工作。Android setonitemclicklistener實現

我想要完成的是能夠點擊ListItem並獲得點擊選項的文章數據。 我有我的文章類中的getName()函數,我需要調用以響應ListItem點擊,但我似乎無法找到一種方法來實現它。

我想在我的AsyncTask類中做到這一點。

使用下面的代碼:

protected void onPostExecute(JSONArray result) { 
      // TODO Auto-generated method stub 

      Log.i("CHECK", "RESULTS: " + result); 

      List<Article> articles = new ArrayList<Article>(); 

      String title = null; 
      String nid = null; 

      try{ 
       for(int i=0; i < data.length(); i++){ 
        JSONObject dataObj = (JSONObject)data.get(i); 
        JSONObject record = dataObj.getJSONObject("node"); 
        title = (record.getString("title")); 
        nid = (record.getString("nid")); 

        Log.i("FOUND", "title: " + title); 
        Log.i("FOUND", "nid: " + nid); 

        articles.add(new Article(title, "", Integer.parseInt(nid))); 
       } 
      }catch(JSONException j){ 
       Log.e("CHECK", "Attempting to read data returned from JSONReader: " + j.toString()); 
      } 

      ListView articlesList = (ListView)findViewById(R.id.articlesList); 
      ArticleAdapter adapter = new ArticleAdapter(ArticlesActivity.this, R.layout.article_item, articles); 
      articlesList.setAdapter(adapter); 

      articlesList.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), "testing : ", Toast.LENGTH_LONG); 
        Log.i("CHECK", "AdapterView: " + parent); 
        Log.i("CHECK", "VIEW : " + view); 
        Log.i("CHECK", "POSITION : " + position); 
        Log.i("CHECK", "ID : " + id); 
       } 
      }); 

      if(dialog.isShowing()) 
       dialog.dismiss(); 
     } 

我的問題是我不知道如何讓setOnItemClickListener工作。 我能夠通過日誌功能打印參數:

Log.i("CHECK", "AdapterView: " + parent); 
Log.i("CHECK", "VIEW : " + view); 
Log.i("CHECK", "POSITION : " + position); 
Log.i("CHECK", "ID : " + id); 

...但我得到的錯誤,當我嘗試鑄造任何參數爲文章對象,以便我可以調用它的getName()函數等。

+0

我對你的問題有點困惑,你究竟在你的OnItemClickListener中完成了什麼? – 2013-02-19 23:46:19

+0

我更新了我的問題 – sisko 2013-02-19 23:55:16

+0

然後Sam的回答對你正在努力完成的事情是正確的。 – 2013-02-20 00:01:08

回答

3

你的AsyncTask似乎嵌套在你的活動,如果它不是簡單地傳遞articles你的活動,然後使用:

articlesList.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     Article article = articles.get(position); 
     // Do something with article 
    } 
}); 
+0

我的AsyncTask確實嵌套在我的Activity類中。另外,onclick監聽器位於AsynchTask類中。由於我對此相當陌生,我不清楚這是否是正確的策略,但該應用程序仍然適用於onclicklistener例外 – sisko 2013-02-19 23:59:59

+0

我嘗試了您的代碼,但它正確地抱怨在我的文章中沒有定義get()函數class – sisko 2013-02-20 00:07:37

+0

不是'article.get()',而是'articles.get()'。 'get()'是一個List的方法,所以你問你的'ArrayList

'是否適合文章。注意區別? – Sam 2013-02-20 02:06:12

0

,你會想要做一個建築的變化,拉你ListViewAdapterOnItemClickListener初始化出AsyncTask,只更新articles以及通知Adapter中的onPostExecute回調。