2013-03-01 3 views
7

ListFragment과 맞춤 어댑터가 있습니다.어댑터에서 ListFragment에 정의 된 메서드를 호출하는 방법은 무엇입니까?

어댑터에서 나는 행에 정의 된 버튼에서 onClick 이벤트를받습니다. onClick 메서드에서 나는 몇 가지 물건을 수행 ListFragment로 전달하고 싶습니다 일부 ID를 얻을.

어댑터에서 ListFragment의 showTask 메서드를 어떻게 호출 할 수 있습니까? 어댑터가 단편의 내부 클래스되는 것이 바로 직접 메소드를 호출 할 수 있도록

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

왜 어댑터가 아닌 액티비티에 onClick 메서드가 있습니까? –

+1

당신의 조각이'showhowask (IShowTask)'메소드를 가지고 있다면, 어댑터는'setShowTaskListener (IShowTask)'메소드를 가지게하십시오. 그러면 ... 프로그래머입니까, 그렇지 않습니까? :) – Selvin

+0

원하는 방식으로 답변을 게시했지만 모든보기에 대해 'OnClickListeners'를 작성하면 안됩니다. 'ListView'에'OnListItemClickListener'를 두는 것을 고려해야합니다. – tolgap

답변

16

일반적인 솔루션이다.

또는 프래그먼트 (또는 프래그먼트로 구현 된 일부 인터페이스)를 해당 생성자를 통해 어댑터로 전달하십시오.

+0

@CommomsWare 당신은 내가 나쁜 프로그래머라고 말할 수 있지만, 당신을 위해서라면 내 문제를 많이 해결할 수는 없을 것입니다. :) – VipulKumar

15

은 다음과 같이 어댑터를 만듭니다

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

고맙지 만 작동하지만, 구현 된 인터페이스를 사용할 것입니다. 조각 대신. – jul

+0

noobs의 경우 대답의 두 번째 절반에 인터페이스 구현이 있습니다. http://stackoverflow.com/a/12142492/609782 – Darpan

관련 문제