2013-03-01 10 views
7

Mam ListFragment i niestandardowy adapter.Jak wywołać metodę zdefiniowaną w ListFragment z adaptera?

Z adaptera otrzymuję zdarzenie onClick z przycisku zdefiniowanego w wierszach. W metodzie onClick dostaję pewien identyfikator, który chciałbym przekazać do ListFragment, aby zrobić kilka rzeczy.

Jak mogę wywołać metodę showTask w metodzie ListFragment z adaptera?

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

adaptera

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

Dlaczego Twoja metoda onClick znajduje się w adapterze, a nie w działaniu? –

+1

Pozwól swojemu fragmentowi implementować interfejs 'IShowTask' (który ma metodę showTask), a następnie pozwól, aby adapter miał metodę' setShowTaskListener (IShowTask) '... to ... jesteś programistą, prawda? :) – Selvin

+0

Wysłałem odpowiedź tak, jak chcesz, ale nie powinieneś tworzyć "OnClickListeners" dla każdego widoku. Powinieneś rozważyć umieszczenie 'OnListItemClickListener' na twoim' ListView'. – tolgap

Odpowiedz

16

Typowym rozwiązaniem jest łącznik być klasa wewnętrzna fragmentu, więc może to wywołać metodę bezpośrednio.

Lub przekazać fragment (lub jakiś interfejs zaimplementowany przez fragment) do adaptera za pośrednictwem jego konstruktora.

+0

@CommomsWare Możesz powiedzieć, że jestem złym programistą, ale nie byłbym w stanie rozwiązać wielu moich problemów, gdyby to nie było dla Ciebie :) – VipulKumar

15

Stwórz swoją kartę tak:

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

Które zmienić konstruktora adaptera:

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

A teraz masz obiekt, który wskazuje na swojej TaskListFragment:

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

Dzięki, działa, ale użyję interfejsu zaimplementowanego w zamiast tego Fragment. – jul

+0

Dla noobów, tutaj jest implementacja interfejsu w drugiej połowie odpowiedzi. http://stackoverflow.com/a/12142492/609782 – Darpan

Powiązane problemy