2013-03-01 7 views
7

Ho uno ListFragment e un adattatore personalizzato.Come chiamare un metodo definito in un ListFragment da un adattatore?

Dall'adattatore viene visualizzato l'evento onClick da un pulsante definito nelle righe. Nel metodo onClick ottengo qualche ID, che mi piacerebbe passare allo ListFragment per fare qualcosa.

Come posso chiamare il metodo showTask nel numero ListFragment dall'adattatore?

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

adattatore

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

Perché il tuo metodo onClick nell'adattatore non è nell'attività? –

+1

Lascia che il tuo frammento implementa l'interfaccia 'IShowTask' (che ha il metodo' showTask'), quindi lascia che l'adattatore abbia il metodo 'setShowTaskListener (IShowTask)' ... quindi ... tu sei il programmatore, vero? :) – Selvin

+0

Ho postato una risposta nel modo che preferisci, ma non devi creare 'OnClickListeners' per ogni vista. Dovresti considerare di inserire un 'OnListItemClickListener' sul tuo' ListView'. – tolgap

risposta

16

Una soluzione comune è che l'adattatore sia una classe interna del frammento, quindi può chiamare direttamente il metodo.

Oppure passare il frammento (o un'interfaccia implementata dal frammento) all'adattatore tramite il suo costruttore.

+0

@CommomsWare Puoi dire che sono un cattivo programmatore, ma non sarei in grado di risolvere molti dei miei problemi se non fosse per te :) – VipulKumar

15

Crea la scheda in questo modo:

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

che avrebbe cambiato il vostro costruttore di adattatore per:

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

E ora, si dispone di un oggetto che punta al tuo TaskListFragment:

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

Grazie, funziona, ma userò un'interfaccia implementata in il frammento invece. – jul

+0

Per i noobs, ecco un'implementazione dell'interfaccia nella seconda metà della risposta. http://stackoverflow.com/a/12142492/609782 – Darpan