2011-08-01 4 views
4

저는 새로운 android compatibility library으로 데모 앱을 만들고 있습니다. ViewPager로 두 개의 listfragments를 보여주고 싶습니다. 첫 번째는 루트 카테고리를 표시하고 두 번째는 하위 카테고리를 표시합니다. 루트 카테고리를 클릭하면 뷰 카테고리가 하위 카테고리로 이동하지만 항상 루트 카테고리 요소를 표시하므로 작동하지 않습니다. 디버그로 몇 분을 소비하고 ViewPager가 첫 번째 이후에 두 번째 조각을 생성한다는 것을 알게되었습니다. (페이저 캐시는 다음 뷰 또는 조각이라고 생각합니다.)ViewPager로 다음 조각을 동적으로로드하십시오.

onListItemClick 후 두 번째 조각을로드 할 수 있습니까? ?

public class ViewPagerDemoActivity extends FragmentActivity implements OnBookSelectedListener { 

private static int mSelectedCategoryId; 
private MyAdapter mMyAdapter; 
private ViewPager mPager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setupPager(); 
} 

private void setupPager() { 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mMyAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mMyAdapter); 
} 

@Override 
public void onBookSelected(int categoryId) { 
    mSelectedCategoryId = categoryId; 
    if (mSelectedCategoryId == 0) { 
     mPager.setCurrentItem(1); 
    } else { 
     mPager.setCurrentItem(0); 
    } 
} 

public static class MyAdapter extends FragmentPagerAdapter { 
    private static final int NUMBER_OF_FRAGMENTS = 2; 

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

    @Override 
    public Fragment getItem(int position) { 
     return BookListFragment.newInstance(mSelectedCategoryId); 
    } 

    @Override 
    public int getCount() { 
     return NUMBER_OF_FRAGMENTS; 
    } 
} 

가}

public class BookListFragment extends ListFragment { 
private static final String ARGUMENT_KEY = "categoryId"; 
private OnBookSelectedListener mOnBookSelectedListener; 
private int mCategoryId; 

public static BookListFragment newInstance(int categoryId) { 
    BookListFragment bookListFragment = new BookListFragment(); 
    Bundle argument = new Bundle(); 
    argument.putInt(ARGUMENT_KEY, categoryId); 
    bookListFragment.setArguments(argument); 
    return bookListFragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mCategoryId = getArguments() != null ? getArguments().getInt(ARGUMENT_KEY) : 0; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, Books.getBooks(mCategoryId))); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.pager_list, container, false); 
    View tv = v.findViewById(R.id.text); 
    ((TextView) tv).setText("Category :" + mCategoryId); 
    return v; 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    if (mCategoryId == 0) { 
     mOnBookSelectedListener.onBookSelected(1); 
    } else { 
     mOnBookSelectedListener.onBookSelected(0); 
    } 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mOnBookSelectedListener = (OnBookSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + "Must Implement OnBookSelectedListener."); 
    } 
} 

public interface OnBookSelectedListener { 
    public void onBookSelected(int categoryId); 
} 

}

public class Books { 
private static final String[] fruits = new String[] { "Apple", "Banana", "Orange" }; 
private static final String[] category = new String[] { "Lorem", "Dolor", "Ipsum" }; 

public static String[] getBooks(int categoryId) { 
    return categoryId == 0 ? category : fruits; 
} 

가}

답변

6

문제를 해결하기 위해 어댑터에 List를 추가해야하고 getItem이 새 인스턴스를 만들지 않으면 목록에서 항목 만 가져옵니다.

이것은 새 코드입니다.

public class ViewPagerDemoActivity extends FragmentActivity implements OnBookSelectedListener { 

private MyAdapter mMyAdapter; 
private ViewPager mPager; 
private BookOnPageChangeListener mBookOnPageChangeListener; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setupPager(); 
} 

private void setupPager() { 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mMyAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mMyAdapter); 
    mBookOnPageChangeListener = new BookOnPageChangeListener(); 
    mPager.setOnPageChangeListener(mBookOnPageChangeListener); 
} 

@Override 
public void onBookSelected(int categoryId) { 
    mMyAdapter.addPage(categoryId); 
    mPager.setCurrentItem(mBookOnPageChangeListener.getCurrentPage() + 1); 
} 

public static class MyAdapter extends FragmentPagerAdapter { 
    private List<Fragment> pages; 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     initPages(); 
    } 

    /** 
    * Create the list and add the first ListFragment to the ViewPager. 
    */ 
    private void initPages() { 
     pages = new ArrayList<Fragment>(); 
     addPage(0); 
    } 

    /** 
    * Add new BookListFragment to the ViewPager. 
    * 
    * @param categoryId 
    *   - the category id 
    */ 
    public void addPage(int categoryId) { 
     pages.add(BookListFragment.newInstance(categoryId)); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return pages.get(position); 
    } 

    @Override 
    public int getCount() { 
     return pages.size(); 
    } 
} 

/** 
* Get the current view position from the ViewPager. 
*/ 
public static class BookOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener { 
    private int currentPage; 

    @Override 
    public void onPageSelected(int position) { 
     // current page from the actual position 
     currentPage = position; 
    } 

    public int getCurrentPage() { 
     return currentPage; 
    } 
} 

}는 onListItemClick 잘 작동

0

당신이 setOnItemClickListener를 사용하여 시도 해 봤나() : 여기

코드인가?

+0

, 나는 ViewPager와 FragmentPageAdapter에 문제가 생겼어요. listrow를 클릭하면 뷰 페이지에 다음 페이지가 표시되지만 listview는 새로 고쳐지지 않습니다. – kameny

+0

ListFragments를 많이 사용하지는 않았지만 onBookSelected 콜백에 문제가 있다고 생각합니다. 거기에 두 번째 조각을 업데이트해야합니다. ViewPager는 처음 생성되었을 때 첫 번째 2 조각을 메모리에로드하고 두 조각 사이를 전환 할 수 있다는 사실은 작동 확인을 의미합니다. –

+0

나는 당신에 동의합니다. ViewPagerDemoActivity.onBookSelected() 메서드에서 현재 단편을 가져 와서 목록을 수동으로 다시 채 보려고했습니다. mMyAdapter.getItem()을 사용하고 있지만이 메서드는 새로운 인스턴스를 반환합니다. 이것이 실제 문제입니다. FragmentStatePagerAdapter와 함께 시도했지만 작동하지 않습니다. – kameny

관련 문제