2013-03-01 11 views
7

Tôi có một số ListFragment và một bộ điều hợp tùy chỉnh.Làm thế nào để gọi một phương thức được định nghĩa trong một ListFragment từ một bộ điều hợp?

Từ bộ điều hợp, tôi nhận được sự kiện onClick từ nút được xác định trong các hàng. Trong phương pháp onClick tôi nhận được một số id, mà tôi muốn vượt qua để ListFragment để làm một số công cụ.

Làm cách nào tôi có thể gọi phương thức showTask trong số ListFragment từ bộ điều hợp?

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

bộ chuyển đổi

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

Tại sao phương thức onClick của bạn trong bộ điều hợp chứ không phải trong hoạt động? –

+1

Hãy để mảnh của bạn triển khai giao diện 'IShowTask' (có phương thức' showTask') sau đó để adapter có phương thức 'setShowTaskListener (IShowTask)' ... thì ... bạn là lập trình viên, phải không? :) – Selvin

+0

Tôi đã đăng câu trả lời theo cách bạn muốn, nhưng bạn không nên tạo 'OnClickListeners' cho mỗi chế độ xem. Bạn nên xem xét việc đặt một 'OnListItemClickListener' vào' ListView' của bạn. – tolgap

Trả lời

16

Một giải pháp thông thường là dành cho các bộ chuyển đổi để trở thành một lớp bên trong của đoạn, vì vậy nó chỉ có thể gọi phương thức trực tiếp.

Hoặc, chuyển đoạn (hoặc một số giao diện được thực hiện bởi đoạn) đến bộ điều hợp thông qua hàm tạo của nó.

+0

@CommomsWare Bạn có thể nói tôi là một lập trình viên xấu, nhưng tôi sẽ không thể giải quyết được nhiều vấn đề của tôi nếu nó không dành cho bạn :) – VipulKumar

15

Tạo adapter của bạn như thế này:

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

Trong đó sẽ thay đổi constructor adapter của bạn để:

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

Và bây giờ, bạn có một đối tượng trỏ đến TaskListFragment của bạn:

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

Cảm ơn, nó hoạt động, nhưng tôi sẽ sử dụng một giao diện được triển khai trong Fragment thay vào đó. – jul

+0

Đối với noobs, đây là một thực hiện giao diện trong nửa thứ hai của câu trả lời. http://stackoverflow.com/a/12142492/609782 – Darpan