2

TabView 대신 PagerSlidingTabStrip을 사용하여 뷰 페이지를 구현하려고합니다. 뷰 페이지에는 세 개의 탭이 있는데, 각 목록 뷰는 이벤트 목록을 표시합니다. 세 가지 탭은 과거, 오늘 및 미래라고 불립니다. github 페이지에서 알 수 있듯이조각을 바꿀 때 PagerSlidingTabStrip에 탭을로드 할 수 없습니다.

나는 슬라이더를 설정 한 :

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     View v = inflater.inflate(R.layout.all_events_main_strip, container, false);  

     // Set up the ViewPager, attaching the adapter and setting up a listener for when the 
     // user swipes between sections. 
     pager = (ViewPager) v .findViewById(R.id.pager_main); 
     tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs); 
     adapter = new MyPagerAdapter(getFragmentManager()); 

     pager.setAdapter(adapter); 
     tabs.setViewPager(pager); 

     // Set Present tab as default 
     pager.setCurrentItem(1); 
     return v; 
    } 

앱은 주요 활동은 처음이 조각에 대한 추가 시작되면 모든 것이 잘 작동합니다. 3 개의 목록 뷰가있는 3 개의 스 와이프 가능한 탭. CF (코드 섹션) 여기

문제입니다 :

내가 발견 한 것을 나는 뒤로 버튼을 누르고 viewpager, 아무튼 중간에 탭을 다시하기 위해 다시 조각을 교체 할 때 listview를 보여주지 마라. 왼쪽이나 오른쪽으로 swype하면 다른 탭의 내용이로드되어 표시되지만 현재 탭은 비어 있습니다. ToNightEvents를 디버깅 할 때 ListFragment가 전혀 호출되지 않습니다. 혹시이 문제를 해결하기위한 제안이 있으십니까?

코드는 다음과 같이 코드가 구성되어

다음 onCreateView 내가 조각을 제거하는 OnDestroyView 방법을 추가했지만 작동하지 않았다 후에는 ... 그런 다음 fragmentPagerAdapter의 각 페이지는 getItem 메소드에서 단편이라고합니다. 마지막으로 코드의 끝에서 당신은 목록보기는 AsyncTask를 통해 채워되는 세 ListFragment 클래스를 볼 수 있습니다

public class FragmentAllEvents extends Fragment 
{ 
    private static final String TAG_UID = "uid"; 
    private static final String TAG_LOGO = "logo"; 
    private static final String TAG_POKUID = "pokuid"; 

    static ArrayList<HashMap<String, String>> userList; 
    ArrayList<HashMap<String, String>> userListTotal; 
    private final Handler handler = new Handler(); 
    HashMap<String, String> userSelected; 
    EventsFunctions eventsFunctions; 
    UserFunctions userFunctions; 
    static ListView lv; 
    ActionBar actionBar; 
    MyPagerAdapter adapter; 
    ViewPager pager; 
    PagerSlidingTabStrip tabs; 
    private Drawable oldBackground = null; 
    private int currentColor = 0xFF666666; 
    //Context context = this; 

    @Override public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     // Set up the action bar. 
     actionBar = getActivity().getActionBar(); 
     actionBar.setHomeButtonEnabled(true); 

    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     View v = inflater.inflate(R.layout.all_events_main_strip, container, false); 
     pager = (ViewPager) v .findViewById(R.id.pager_main); 
     tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs); 
     adapter = new MyPagerAdapter(getFragmentManager()); 

     pager.setAdapter(adapter); 

     tabs.setViewPager(pager); 

     pager.setCurrentItem(1); 
     return v; 
    } 

    @Override 
    public void onDestroyView() 
    { 
     super.onDestroyView(); 
     getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 
    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter 
    { 

     public MyPagerAdapter(FragmentManager fm) 
     { 
      super(fm); 
     } 


     @Override 
     public Fragment getItem(int i) 
     { 
      switch (i) 
      { 
       case 0: 
        return new PastEvents(); 

       case 1: 
        return new ToNightEvents(); 

       case 2: 
        return new FutureEvents(); 

       /*default: 
        // The other sections of the app are dummy placeholders. 

        return new ToNightEvents(); 
        */ 
      } 
      return null; 
     } 


     /** 
     * A fragment that launches past events list. 
     */ 
     public static class PastEvents extends ListFragment implements 
     PullToRefreshAttacher.OnRefreshListener 
     { 
      private ListView pastList; 
      private PullToRefreshAttacher mPullToRefreshAttacher; 
      ProgressBar progress; 
      String tabTime; 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
       View pastView = inflater.inflate(R.layout.pastlist, container, false); 
       progress = (ProgressBar) pastView.findViewById(R.id.loading_spinner_past); 
       tabTime="past"; 
       pastList = (ListView) pastView.findViewById(android.R.id.list); 

       // Now get the PullToRefresh attacher from the Activity. An exercise to the reader 
       // is to create an implicit interface instead of casting to the concrete Activity 
       mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher(); 

       // Now set the ScrollView as the refreshable view, and the refresh listener (this) 
       mPullToRefreshAttacher.addRefreshableView(pastList, this); 

       new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime); 
       return pastView; 
      } 


      @SuppressWarnings("unchecked") 
      @Override 
      public void onListItemClick(ListView listView, View view, int position, long id) 
      { 
       super.onListItemClick (listView, view, position, id); 
       HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position); 
       //Log.e("AttendList Report", "Clicked list item: " + position +" Content: \n" + map.get(TAG_ID).toString()); 
       Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString()); 
       Intent intent = new Intent(getActivity(), SingleEventActivity.class); 

       intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString(); 
       intent.putExtra("uid", map.get(TAG_UID)); 
       intent.putExtra("logo",map.get(TAG_LOGO)); 
       getActivity().startActivity(intent); 
      } 

      @Override 
      public void onRefreshStarted(View view) 
      { 
       new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime);     
      } 

     } 

     /** 
     * A fragment that launches future event list. 
     */ 
     public static class FutureEvents extends ListFragment implements 
     PullToRefreshAttacher.OnRefreshListener 
     { 
      private ListView futureList; 
      private PullToRefreshAttacher mPullToRefreshAttacher; 
      ProgressBar progress; 
      String tabTime; 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
       View futureView = inflater.inflate(R.layout.futurelist, container, false); 
       progress = (ProgressBar) futureView.findViewById(R.id.loading_spinner_future); 
       tabTime = "future"; 
       futureList = (ListView) futureView.findViewById(android.R.id.list); //change to attendlist if needed 


       // Now get the PullToRefresh attacher from the Activity. An exercise to the reader 
       // is to create an implicit interface instead of casting to the concrete Activity 
       mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher(); 

       // Now set the ScrollView as the refreshable view, and the refresh listener (this) 
       mPullToRefreshAttacher.addRefreshableView(futureList, this); 

       new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime); 
       return futureView; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      public void onListItemClick(ListView listView, View view, int position, long id) 
      { 
       super.onListItemClick (listView, view, position, id); 

       HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position); 
       Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString()); 
       Intent intent = new Intent(getActivity(), SingleEventActivity.class); 


       intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString(); 
       intent.putExtra("uid", map.get(TAG_UID)); 
       intent.putExtra("logo",map.get(TAG_LOGO)); 
       getActivity().startActivity(intent); 

      } 

      @Override 
      public void onRefreshStarted(View view) 
      { 
       new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime);    
      } 
     } 

     /** 
     * A fragment that launches future event list. 
     */ 
     public static class ToNightEvents extends ListFragment implements 
     PullToRefreshAttacher.OnRefreshListener 
     { 
      private ListView tonightList; 
      private PullToRefreshAttacher mPullToRefreshAttacher; 
      ProgressBar progress; 
      String tabTime; 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
       View tonightView = inflater.inflate(R.layout.tonightlist, container, false); 
       progress = (ProgressBar) tonightView.findViewById(R.id.loading_spinner_tonight); 
       tabTime = "tonight"; 
       tonightList = (ListView) tonightView.findViewById(android.R.id.list); //change to attendlist if needed 

       // Now get the PullToRefresh attacher from the Activity. An exercise to the reader 
       // is to create an implicit interface instead of casting to the concrete Activity 
       mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher(); 

       // Now set the ScrollView as the refreshable view, and the refresh listener (this) 
       mPullToRefreshAttacher.addRefreshableView(tonightList, this); 

       new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime); 
       return tonightView; 
      } 


      @SuppressWarnings("unchecked") 
      @Override 
      public void onListItemClick(ListView listView, View view, int position, long id) 
      { 
       super.onListItemClick (listView, view, position, id); 

       HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position); 
       Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString()); 
       Intent intent = new Intent(getActivity(), SingleEventActivity.class); 


       intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString(); 
       intent.putExtra("uid", map.get(TAG_UID)); 
       intent.putExtra("logo",map.get(TAG_LOGO)); 
       getActivity().startActivity(intent); 

      } 

      @Override 
      public void onRefreshStarted(View view) 
      { 
       new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime);    
      } 
     } 

     public String[] titles= 
     { 
      "Past", 
      "Tonight", 
      "Future" 
     }; 

     @Override 
     public int getCount() 
     { 
      return titles.length; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) 
     { 
      return titles[position]; 
     } 
    } 
} 
+0

) 내가 늦게 조금있어하지만 누군가가 여기에 같은 오류가 일어나는 경우 = 해결책이라고 생각합니다. 그것을 해결 했습니까? – SparX

+0

나는 또한 동일한 문제를 가지고있다 업데이트하고있다 ??? –

+0

@SparX 문제를 해결 했습니까? –

답변

0

중동 위해 고정 다음 :

  • 은 조각 관리자에 OnBackStackChangedListener 추가 .
  • onBackStackChanged 메서드에서 ViewPager 및 PagerSlidingTabStrip (예제의 호출기 및 탭)에 대한 참조를 가져옵니다. 적절한 조각은 현재 활성화되어있는 경우, 다음을 수행하십시오 당신이 활동에 있다면

    pager.invalidate(); 
    tabs.invalidate(); 
    pager.setAdapter(new MyPagerAdapter(getFragmentManager())); 
    tabs.setViewPager(pager); 
    
5

이 정상적으로 작동합니다,하지만 난 당신이 게시 코드는 방법이기 때문에 당신이 조각에 생각 onCreateView(). 문제는 Activity의 FragmentManager를 사용하려고하고 Fragment의 FragmentManager를 사용해야한다는 것입니다. 이 FragmentManager는 필요한 것이 아닙니다. 대신이 시도 :

adapter = new MyPagerAdapter(getChildFragmentManager()); 

을 나는 같은 문제가

Q.

+0

훌륭하고, 대접 받았다! –

+0

고마워요 :) @Qiwii – Mithran

관련 문제