0

カスタムアダプタを使用したListViewの複数回のクリックに問題があります。

onClickイベントをすべて正常にキャッチしています。問題は、Webサービスを呼び出す行クリックごとにAsyncTaskを開始する必要があることです。同じAsyncTaskですが、パラメータが異なります。

ユーザーが複数の行をすばやくクリックすると、最後のAsyncTaskのみが起動され、その行のみが更新されます。

onClick()を処理するコード

myListView.setOnItemClickListener(new OnItemClickListener() 
    {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
            Item item = (Item) mylLstView.getAdapter().getItem(position);           


            //execute AsyncTask
        }
    });

私のAsyncTask

private class CheckItemInOrOutTask extends AsyncTask<Context, Void, Boolean>
{
    private int position;
    Item singleItem;

    public CheckItemInOrOutTask(int position, Item singleItem)
    {
        this.position = position;
        this.singleItem = singleItem;
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();           
    }

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            HttpClient client = HttpUtil.getHttpClient();
            String reqString = "Items?action=checkin";

            HttpPost post = HttpUtil.makePost(reqString);       

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("item_id", singleItem.getId()));

            nameValuePairs.add(new BasicNameValuePair("type_id", singleItem.getTypeId()));              

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));               

            HttpResponse response = client.execute(post);
            int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode == 200) 
            {           
                String result = HttpUtil.responseToString(response);    
                JSONObject jsonItem = new JSONObject(result);
                Item item = new Item(); 

                // parse json
                // set item properties          

                itemList.set(position,item);                    
            }               
        }
        catch (Exception e)
        {
            return false;
        }   

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
        super.onPostExecute(result);    

        //if (result) 
        {
            updateAdapter();                            
        }       
    }       
}

誰かがそれに光を当てることができますか?

どうもありがとう。

4

1 に答える 1

0

犯人はAsyncTaskではないことがわかりました。HttpClientを再利用していたためです。

于 2012-12-30T17:01:18.490 に答える