Как вызвать метод, определенный в ListFragment из адаптера?

У меня есть ListFragment и пользовательский адаптер.

Из адаптера я получаю событие onClick от кнопки, определенной в строках. В методе onClick я получаю некоторый идентификатор, который я бы хотел передать в ListFragment чтобы сделать что-то.

Как я могу вызвать метод showTask в ListFragment из адаптера?

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

Solutions Collecting From Web of "Как вызвать метод, определенный в ListFragment из адаптера?"

Общим решением для адаптера является внутренний класс фрагмента, поэтому он может просто вызвать метод напрямую.

Или передайте фрагмент (или некоторый интерфейс, реализованный фрагментом) в адаптер через его конструктор.

Создайте свой адаптер следующим образом:

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