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

时间:2015-08-05 15:33:31

标签: android android-fragments android-listfragment

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

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

3 个答案:

答案 0 :(得分:1)

与其他任何地方的Async任务不同。看一下文档

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

为您的任务创建一个类

 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);

答案 1 :(得分:0)

这是扩展Asynctask

的类
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();

答案 2 :(得分:0)

为了拥有功能齐全的ListView,您需要适配器

所以,这里最好的方法是:

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