2013-03-01 54 views
7

我有一個ListFragment和一個自定義適配器。如何從適配器調用ListFragment中定義的方法?

從適配器我從行中定義的按鈕獲得onClick事件。在onClick方法中,我得到了一些id,我想將它傳遞給ListFragment做一些事情。

如何從適配器調用ListFragment中的方法showTask?

listfragment

public class TaskListFragment extends ListFragment{ 

    /* ... */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     mAdapter = new TaskListAdapter(getActivity(), data);   
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     setListAdapter(mAdapter); 
    } 

    public void showTask(long id) { 

     FragmentTransaction ft = getFragmentManager().beginTransaction(); 

     TaskFragment taskFragment = new TaskFragment(); 

     Bundle args = new Bundle(); 
     args.putLong("id", id); 
     taskFragment.setArguments(args); 

     ft.replace(R.id.fragment_container, taskFragment); 
     ft.commit();   
    } 
} 

適配器

public class TaskListAdapter extends ArrayAdapter<Task>{ 

    /* ... */ 

    private OnClickListener mOnClickListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      long id = (Integer) v.getTag(); 
      // how can I call showTask(id) ? 
     } 
    }; 
} 
+0

爲什麼你的onClick方法在適配器中而不是在活動中? – 2013-03-01 15:17:17

+1

讓你的片段實現'IShowTask'接口(它具有'showTask'方法),然後讓適配器具有'setShowTaskListener(IShowTask)'方法...然後...你是程序員,不是嗎? :) – Selvin 2013-03-01 15:19:28

+0

我發佈了一個你想要的答案,但是你不應該爲每個視圖創建'OnClickListeners'。你應該考慮在你的'ListView'上放置一個'OnListItemClickListener'。 – tolgap 2013-03-01 15:24:24

回答

16

一個常見的解決方案是爲適配器是一個內部類的片段的,因此它可以只直接調用該方法。或者,通過其構造函數將片段(或片段實現的某個接口)傳遞給適配器。

+0

@CommomsWare你可以說我是一個糟糕的程序員,但如果它不適合你,我將無法解決很多我的問題:) – VipulKumar 2014-12-03 12:04:05

15

這樣創建您的適配器:

@Override 
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState); 
    mAdapter = new TaskListAdapter(getActivity(), data, TaskListFragment.this);   
} 

這將您的適配器的構造函數更改爲:

public TaskListAdapter(Context context, List<Task> data, TastListFragment fragment) { 
    this.fragment = fragment; 
} 

而現在,你有一個指向您的TaskListFragment對象:

private OnClickListener mOnClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     long id = (Integer) v.getTag(); 
     fragment.showTask(id); 
    } 
}; 
+6

謝謝,它可以工作,但我會使用一個實現的接口而不是片段。 – jul 2013-03-01 15:34:37

+0

對於noobs,這裏是接口的下半部分的實現。 http://stackoverflow.com/a/12142492/609782 – Darpan 2015-08-27 13:16:36

相關問題