2013-03-01 43 views
7

ListFragment ve özel bir bağdaştırıcım var.Bir adaptörden bir ListFragment içinde tanımlanan bir yöntem nasıl çağrılır?

Bağdaştırıcıdan, satırlarda tanımlanmış bir düğmeden onClick olayını alıyorum. onClick yönteminde bazı şeyler yapmak için ListFragment'a geçmek istediğim bir kimlik alıyorum.

Adaptörden ListFragment yönteminde showTask yöntemini nasıl çağırabilirim? Adaptör fragmanının bir iç sınıf olması için sadece direkt olarak yöntem çağrı böylece

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

adaptör

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

Neden onClick yönteminiz adaptörde ve etkinlikte değil? –

+1

Parçalarınızın 'IShowTask' arabirimini (showTask' yöntemine sahip) uygulamasına izin verin ve sonra adaptör' setShowTaskListener (IShowTask) 'yöntemine izin verin ... o zaman ... programcı sizsiniz, değil mi? :) – Selvin

+0

İstediğiniz şekilde bir yanıt gönderdim, ancak her görünüm için 'OnClickListeners 'oluşturmamalısınız. ListView'ınıza bir 'OnListItemClickListener 'koymayı düşünmelisiniz. – tolgap

cevap

16

ortak bir çözümdür. Veya, parçacığa (veya parçanın uyguladığı bazı arabirimlere) yapıcı aracılığıyla bağdaştırıcıya iletin.

+0

@CommomsWare Kötü bir programcı olduğumu söyleyebilirsin, ama senin için olmasaydı, çok fazla sorunumu çözemezdim :) – VipulKumar

15

bu gibi adaptörü oluşturun:

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

için adaptör yapıcısı değiştirecek hangisi:

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

Ve şimdi, sen TaskListFragment işaret eden bir nesne var:

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

Teşekkürler, işe yarıyor ama bende bir arayüz kullanacağım bunun yerine Fragment. – jul

+0

noobs için, burada cevabın ikinci yarısında bir arayüz uygulamasıdır. http://stackoverflow.com/a/12142492/609782 – Darpan

İlgili konular