2014-04-10 3 views
0
안드로이드

에서 조각을 호출 할 필요가 내 클래스는이내가 여기에 데이터 어댑터

public class TicketAdapter extends ArrayAdapter<Ticket> { 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    TicketHolder holder = null; 

    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    row = inflater.inflate(layoutResourceId, parent, false); 

    holder = new TicketHolder(); 
    holder.ticket = items.get(position); 
    holder.removeTicketButton = (ImageButton)row.findViewById(R.id.ticket_remove); 
    holder.removeTicketButton.setTag(holder.ticket); 

    holder.settingTicketButton=(ImageButton)row.findViewById(R.id.ticket_setting); 
    holder.settingTicketButton.setTag(holder.ticket); 

    holder.settingTicketButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 



    holder.name = (TextView)row.findViewById(R.id.ticket_name); 
    setNameTextChangeListener(holder); 
// holder.value = (TextView)row.findViewById(R.id.atomPay_value); 
// setValueTextListeners(holder); 

    row.setTag(holder); 

    setupItem(holder); 
    return row; 
} 
} 

처럼 그리고 내 다른 자바 파일이 여기에이

public class FreeFragment extends Fragment 

{

} 

처럼, TicketAdapter 클래스에서 FreeFragment 클래스를 호출하고 싶습니다. 이 버튼을 클릭하는 동안 FreeFragment를 호출해야합니다 (R.id.settingTicketButton). DataAdapter에서이 Fragment를 호출하는 방법? 가능한가? 도와주세요.

+2

인터페이스를 사용하고 콜백 함수를 만든다. –

+0

당신의 친절한 지원에 대해 대단히 감사합니다 ... – user3388240

답변

0

내 해결책을 찾았습니다. .. 내가 TicketAdapter.java 파일에 다음 코드 ..

holder.settingTicketButton=(ImageButton)row.findViewById(R.id.ticket_setting); 
    holder.settingTicketButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 

      Fragment freeFragment = new FreeFragment(); 
      if (freeFragment != null) 

       switchFragment(freeFragment); 
      Log.e("adapter_click_setting","adapter_click_setting"); 
     } 
    }); 
} 

private void switchFragment(Fragment newFragment) 
{ 

    if (context == null) 
    { 
     Log.e("null_context","nulllll"); 
     return; 
    } 
    if (context instanceof AddNewTicket) { 
     Log.e("meth_calling","method_calling"); 
     AddNewTicket feeds = (AddNewTicket) context; 
     feeds.switchContent(newFragment); 
    } 

}

를 쓴 내가 AddNewTicket.java 파일에 다음과 같은 방법을 쓴 다음

public void switchContent(android.support.v4.app.Fragment newFragment) { 
    // TODO Auto-generated method stub 
    getSupportFragmentManager().beginTransaction() 
    .replace(R.id.fragment_container, newFragment).commit(); 

} 

의 R .id.fragment_container는 내 ticket_listview.xml 파일의 ID입니다. 나는 그 XML 파일에서 FragmentLayout을 선언했다 ....

0

가장 좋은 방법은 FreeFragment 인스턴스에 TicketAdapter의 생성자에 변수를 전달하고 어댑터에 저장하는 것입니다.

가능하지 않은 경우 다음 승인을 사용할 수 있습니다. 조각 추가하고 볼 수 있는지 알 수 없기 때문에

Fragment fragment = ((Activity)context).getfragmentmanager.findfragmentById(R.id.your_fragment_container_id); 

내가 TicketAdapter에서 직접 FreeFragment에 액세스 할 것 생성자

+0

어디에서 R.id. your_fragment_container_id ?? 제발 도와주세요 .. 그 긴급 .. – user3388240

+0

그것은'getfragmentmanager.add()'와 함께 사용되는 ID입니다. 프래그먼트가 추가 된 ID – SathMK

0

이 코드를 추가합니다. 어댑터에서 호출 될 소유자 활동에 메소드를 정의합니다. 이 메서드에서는 조각이 null이 아닌지 먼저 확인한 다음 조각에서 어떤 메서드를 호출합니다. 뭔가 (부모 활동에서) :

public void callFragmentMethod() { 
    FragmentManager fm = getFragmentManager(); 
    Fragment fragment = fm.findFragmentByTag("SOME_TAG"); 
    if(fragment != null) { 
     FreeFragment ff = (FreeFragment) fragment; 
     ff.callSomeMethod(); 
    } 
} 

활동에 대한 참조를 어댑터에 전달하고 어댑터에서 위의 메소드를 호출하십시오. 또는 코드를 더 아름답게 유지하고 확장하기 쉽도록 위 메서드를 정의하고 인터페이스를 사용하려면 인터페이스를 확장하고 인터페이스를 어댑터에 대한 참조로 보냅니다. 어댑터가 FragmentActivity에 액세스 할 수있는 경우

+0

프래그먼트 프래그먼트 = fm.findFragmentByTag ("SOME_TAG"); 어떤 태그를 써야할까요? 어디에서이 태그를 얻을 수 있습니까? DataAdapter에서 Fragment를 호출하는 것이 시급한데 .. 도와주세요 ... – user3388240

+0

조각을 추가 할 때는 조각이있는보기 그룹 ID와 자신이 정의한 선택적 태그를 지정하여 추가 할 수 있습니다. 그런 다음 태그로 또는 ID로 조각을 가져올 수 있습니다. – gunar

0

그래서, 당신은 FragmentManager 추가 전화 단편 호출해야합니다

FragmentManager fragmentManager = yourFragmentActivity.getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
// Create new fragment and transaction 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack 
transaction.replace(R.id.fragment_container, yourFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 
0
어떤 이름

줄이 조건

1) 생성을 하나의 인터페이스를 처리 할 수 ​​

쉬운 단계

2) ewquirement 예제에 따라 메서드를 정의하십시오. MyCommumicator 예제 refreshata를 사용하여 인터페이스 내 메서드를 정의합니다.

public void refreshData(); 

이제 조각에 해당 인터페이스를 구현하고 메소드를 구현)

MyCommumicator myCommumicator; 

3처럼 adater에서 인터페이스의 참조를 가져 가라.

4) 지금

또 다른 방법 사용 LocalBroadCast을 즐길 그냥이

myCommumicator.refreshData(); 

같이 전화 호출

public TicketAdapter(other params...,MyCommumicator MyCommumicator){ 
    this.myCommumicator = myCommumicator; 
} 

6) 시간처럼 어댑터의 Constractor을 만들 수 있습니다.