从片段内的列表项中单击按钮调用异步任务

Calling an async task from a button click in a listitem inside of a fragment

我的应用程序有一个 NavigationDrawer activity 可以根据选择交换片段。其中一个片段包含一个带有多个按钮的列表视图。列表视图项目本身是不可选择的,但我需要处理按钮点击,我能够在我的自定义适配器中成功捕获。

这是我的问题:一些按钮点击需要触发异步任务来调用 REST api url。我不知道该怎么做。我尝试在我的片段上调用静态方法来实例化私有 class 的实例(扩展 AsyncTask),但这不起作用。我考虑过在我的自定义适配器中创建一个从 AsyncTask 扩展的私有 class,但感觉不对。做这样的事情的正确方法是什么?

它与来自其他任何地方的异步任务没有什么不同。查看文档

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

为您的任务创建一个class

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
}

然后在您的 onClick 事件中创建它的一个实例

 new DownloadFilesTask().execute(url1, url2, url3);

这是扩展 Asynctask

的 class
public class webservice extends AsyncTask<Object, Object, Object>{

private Context c;


public webservice(int mode)
{

}


public void set_context(Context c)
{this.c =c;

}


public void call_webservice_login() 
{
// procedure to call webservice etc...



}




@Override
protected Object doInBackground(Object... arg0) {
    // TODO Auto-generated method stub

     call_webservice_login();
    return 0;
}




protected void onProgressUpdate(Integer... progress) {
   //update your UI, etc
}


protected void onPreExecute(){ 
       super.onPreExecute();
            pgd = new ProgressDialog(c);
            pgd.setMessage("Loading...");
            pgd.show();    
    }


protected void onPostExecute(Object result) {
 // TODO Auto-generated method stub
 super.onPostExecute(result);


}

}

你可以这样称呼它。

webservice wb1 = new webservice(1);
            //wb1.set_context(this);
            wb1.execute();

为了获得功能齐全的 ListView,您需要一个 适配器

因此,这里最好的方法是:

  1. 在适配器构造函数中,声明一个调用 AsyncTask 的 OnClickListener
  2. 在适配器的 getView() 方法中,将侦听器添加到必须执行任何操作的按钮:myButton.setOnClickListener(mListener)
  3. 如果您需要为不同的按钮使用任何特殊参数,我建议在 getView() 方法中使用 myView.setTag(Object) 添加一些标志或对象到按钮。监听器在调用时接收到一个View参数,即被点击的视图。只需在您的侦听器代码中使用 view.getTag() 即可确定按下了哪个按钮。