1

リモート JSON データを読み取るために使用している ArticlesAdapter があります。アダプターは機能していますが、ListView setonitemclicklister を機能させるのに苦労しています。

私が達成しようとしているのは、ListItem をクリックして、クリックされたオプションの Article データを取得する機能です。Article クラスに 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 関数を使用して引数を出力できます。

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

...しかし、引数のいずれかを Article オブジェクトにキャストしようとするとエラーが発生するため、getName() 関数などを呼び出すことができます。

4

2 に答える 2

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
    }
}); 
于 2013-02-19T23:43:26.003 に答える
0

必要なアーキテクチャの変更はListView、 、Adapter、およびOnItemClickListener初期化を から引き出し、コールバックでAsyncTask更新articlesと通知のみを行うことです。AdapteronPostExecute

于 2013-02-20T00:36:22.777 に答える