2013-01-19 2 views
1

나는 ViewPager을 처음 사용하지만 사용자가 새 항목을 추가/삭제할 수있는 앱의 초기 화면은 ListView이며 항목 중 하나를 클릭하면 해당 항목이 " 세부 정보 "조각은 전달 된 ID를 기반으로합니다. 사용자가 목록에서 각 세부 정보로 스 와이프 할 수 있기를 바랍니다.ViewPager 용 조각을 동적으로 생성하기

나는 항상 ID가 1을 벗어나는 것을 제외하고는 ViewPager이 작동합니다. 이 부분은 ViewPagers에 대한 이해가 부족한 부분 일 수 있습니다. 그러나 세부 정보 부분의 onCreateView에 중단 점을 넣으면 앱이로드되고 전달 된 ID가 첫 번째 ID 일 때 중단 점에 도달합니다. 앱이로드 될 때 앱의 ID가 onCreateView 인 앱 스토어에서 ID가 1,2,3,4 인 경우 목록에서 첫 번째 세부 정보 조각까지 처음 스 와이프하면 ID는 2입니다. (내가 1 일 것으로 기대할 때).

내가 지금까지 무엇을 가지고 :

Main.class가 (이 초기 활성을 응용 프로그램에 시동)

public class Main extends SherlockFragmentActivity 
{ 
    private static int NUMBER_OF_PAGES; 
    private ViewPager mViewPager; 
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments; 

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

     setContentView(R.layout.main); 

     mViewPager = (ViewPager)findViewById(R.id.viewpager); 
     mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); 
     mViewPager.setAdapter(mMyFragmentPagerAdapter); 

     final List<Integer> ids = GetIds(); //loads ids to popular the viewpager 

     NUMBER_OF_PAGES = ids.size(); 

     fragments = new ArrayList<Fragment>(); 

     fragments.add(new ListingFragment()); //initial screen 

     for(Integer id : ids) 
      fragments.add(DetailsFragment.newInstance(id)); 
    } 

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {    

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

     @Override 
     public Fragment getItem(int index) { 

      return fragments.get(index); 
     } 

     @Override 
     public int getCount() { 

      return NUMBER_OF_PAGES; 
     } 
    } 
} 

DetailsFragment.class을

public class DetailsFragment extends SherlockFragmentActivity 
{ 
    private int detailId; 
    private List<Integer> items; 

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

    @Override 
    public void onActivityCreated(final Bundle icicle) 
    {  
     super.onActivityCreated(icicle); 
    } 

    public static DetailsFragment newInstance(int id) { 

     DetailsFragment lf = new DetailsFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("id", id); 
     lf.setArguments(bundle); 
     return lf; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.details, container, false); 

     detailId = getArguments().getInt("id"); //this id is always off 

     items = GetItems(); 

     return view; 
    } 
} 

답변

0

ID가 alwa 인 것 외에는 ViewPager가 작동합니다. 하나씩 떨어져. ViewPagers에 대한 이해가 부족한 부분 일 수 있지만, 세부 프래그먼트의 onCreateView에 중단 점을 넣으면 앱이로드되고 전달 된 ID가 첫 번째 ID 일 때 중단 점 이 발생합니다. 그래서 id가 1,2,3,4 인 경우 앱이로드 될 때onCreateView의 시작 ID가 1입니다. 첫 번째 세부 정보 조각의 첫 번째 스 와이프를 수행하면 ID는 2입니다 ( 일 때 1이 될 것으로 기대합니다). 즉 현재는로 컴파일되지 않습니다 (사용하는 전체 코드 인 경우

어쩌면 내가 다시 당신이 직면하고있는 문제 그러나 당신이 게시 코드를 (이해하지 못하는 당신의 DetailsFragmentsSherlockFragmentActivity를 확장 (?!))) 당신이 말하는 것을 할 수 없습니다. 프래그먼트를 설정하는 방법에 따라 프래그먼트가 적절한 ID를 갖게됩니다.

당신이보고있는 것은 ViewPager의 작동 방식 때문일 가능성이 큽니다. 이는 오도 할 수 있습니다. 앱을 처음 시작하면 ListingFragment이 표시됩니다. 이제 ViewPager은 사용자에게 부드러운 스 와이프를 제공하기 위해 현재 보이는 조각의 양쪽에 하나의 추가 조각을로드합니다. 따라서 앱이 시작될 때 ViewPager 페이지는 0 (ListingFragment)을로드하고 다음 (왼쪽으로 갈 곳이 없으므로 오른쪽으로)) 페이지 1 (인 DetailsFragment). ListingFragment에서 처음으로 DetailsFragment (id가 1 인 항목)으로 스 와이프하면 ViewPager은 (2) 두 번째 DetailsFragment을 자동으로 생성합니다 (바로 다시 스 와이프 할 수 있도록).당신이합니다 (id를 보려면)에 DetailsFragmentonCreateViewLog 문이있는 경우 해당 Log 첫 번째 DetailsFragment에서 표시되지 않기 때문에 처음 DetailsFragmentListingFragment에서 슬쩍 당신이 (와 두 번째 ID를 볼 것을 지금, 그것은 정상입니다 이미 생성 된 ID 1)가 생성되면 두 번째 DetailsFragment (id가 2 인)이 미리 생성되므로 나타납니다.

또한 미묘한 버그를 소개하면서 코드를 수정하십시오. 어댑터 크기를 NUMBER_OF_PAGES으로 설정하고 ids.size()으로 초기화하지만 에서 인 DetailsFragment이 전혀 표시되지 않게하려면 ListingFragment을 추가하십시오.

+0

당신 말이 맞아요. 'ids.size() + 1'을 추가하는 것을 잊어 버렸습니다. 이것은 코드의 차용 버전입니다. 그래서 나는 그것을 질문에 잘못 추가했습니다. 그러나 이것은'ViewPager'와 관련된 모든 코드입니다. 위의 코드가 작동해야한다는 것을 이해합니다. 그럴 경우, ID를 끄는'ViewPager' 외부의 것이어야합니다. –

+0

@KrisB 아직 이해가 안됩니다. ID가 1 씩 나간 것을 어떻게 알 수 있습니까? 로그 문이 있습니까? 프래그먼트 컨텐트가 ID와 오프셋됩니까? 다른 것? – Luksprog

+0

드디어 내 머리가 감싸는 것 같아. 나는 틀렸어, 이드는 꺼지지 않았어, 네가 그걸 묘사 한 것 뿐이야, 내가 스 와이프 할 때, 다음 이드를 실행 중이다. 이런 종류의 또 다른 질문이 생깁니다. 프래그먼트에 초기화 코드를 배치하는 가장 좋은 이벤트는 무엇입니까? onCreate, onCreateView, onResume 또는 onActivityCreated. 나는 'ActionBar' 제목을 설정하고 있지만 너무 일찍 설정되는 것처럼 보입니다. 예를 들어 첫 번째 화면에있을 때 표시되는 제목은'ViewPager '의 다음 화면입니다. –

관련 문제