2013-12-11 87 views
0

我有一個問題,從ListAdapter中啓動一個新的AsyncTask。但首先,這裏是的情況:從ListAdapter中啓動一個AsyncTask

我有一個活動,包含一個ListView。此ListView通過適配器填充

ReservationAdapter adapter = new ReservationAdapter(self, (List<Reservation>) msg.obj); 
reservationListView.setAdapter(adapter); 

ReservationAdapter具有自定義列表項(2個字符串+ 1個按鈕)。下面的getView() - 方法:

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    View view = convertView; 
    if (convertView == null) { 
     view = layoutInflater.inflate(R.layout.list_item_reservation, null); 
    } 

    ImageButton button = (ImageButton) view.findViewById(R.id.removeButton); 
    LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.linearLayout); 
    TextView title = (TextView) view.findViewById(R.id.title); 
    TextView subTitle = (TextView) view.findViewById(R.id.subTitle); 

    button.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // Here I need to start the AsyncTask 
     } 
    }); 

    // Here I'm filling the Labels... (not important) 

    return view; 
} 

我知道,如何啓動任務出的正常活動的聽衆,但我如何啓動它從onClicklistener在適配器類?

+0

我不明白這個問題嗎?你可以在任何你想要的地方開始異步任務。究竟是什麼讓你煩惱? – JanBo

回答

1

雖然我不同意這個設計選擇。從適配器啓動異步任務通常不是一個好主意。但是,您可以像從活動或片段中那樣啓動它。

如果您有擴展要啓動例如異步任務等級:

public class MyTask extends AsyncTask<Void, Void, Void>{ 

    public MyTask(){} 

    @Override 
    protected String doInBackground(Void... params) { 
     return null 
    } 

} 

在你onClick你可以簡單地啓動這個任務是這樣的:

MyTask task = new MyTask(); 
task.execute(); 

另一種方式將該任務定義爲您的onClick(也是不好的設計)中的另一個內部類,並從那裏執行它。類似這樣的:

  @Override 
      public void onClick(View v) 
      { 
       new AsyncTask<Void, Void, Void>(){ 

        @Override 
        protected Void doInBackground(Void... params) 
        { 
         return null; 
        } 
       }.execute(); 
      } 

我強烈建議您將任務移至活動/片段(如果可能)。 Here是異步任務的文檔。通過它來更好地瞭解何時以及如何使用它。

+0

mhm,謝謝我認爲在我的活動中這樣做更好。但是我怎麼能從listener內部調用Activity中的一個方法呢? – ray

+1

根據你當前的實現,沒有一種好的方法調用活動中的方法。看看[這](http://stackoverflow.com/questions/3438408/how-to-avoid-setting-inline-onclicklistner-in-getview)的問題。另請看[onItemClickListener](http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html)。這將使整行可點擊而不是按鈕,但您可以在活動端實現它。 – Naveed

+0

是的,我已經做到了,因爲你說,並知道它工作正常:)也有我的一個愚蠢的錯誤。 – ray