2013-03-01 22 views
7

ListFragmentとカスタムアダプターがあります。アダプタからListFragmentで定義されたメソッドを呼び出す方法は?

アダプターからは、行に定義されたボタンからonClickイベントを取得します。 onClickメソッドでは、私はListFragmentにいくつかのことをするために渡したいいくつかのIDを取得します。

アダプタから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メソッドがアクティビティではなくアダプタ内にありますか? –

+1

あなたのフラグメントが 'showhowtask'インターフェース(' showTask'メソッドを持っています)を実装して、アダプタに 'setShowTaskListener(IShowTask)'メソッドを持たせるようにしてください...そして...あなたはプログラマですね。 :) – Selvin

+0

私はあなたが望むように回答を投稿しましたが、すべてのビューに対して 'OnClickListeners'を作成すべきではありません。 'ListView'に' OnListItemClickListener'を置くことを検討すべきです。 – tolgap

答えて

16

一般的な解決策です。

または、フラグメント(またはフラグメントによって実装されたインタフェース)を、コンストラクタを介してアダプタに渡します。

+0

@CommomsWare私は悪いプログラマだと言うことができますが、それはあなたのためではなかったら私の多くの問題を解決することはできません:) – VipulKumar

15

このようなあなたのアダプタを作成します。

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); 
    } 
}; 
をするアダプタのコンストラクタを変更します

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

+6

ありがとう、それは動作しますが、代わりにフラグメント。 – jul

+0

noobsについては、答えの後半にinterfaceの実装があります。 http://stackoverflow.com/a/12142492/609782 – Darpan

関連する問題