저는 새로운 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;
}
가}
, 나는 ViewPager와 FragmentPageAdapter에 문제가 생겼어요. listrow를 클릭하면 뷰 페이지에 다음 페이지가 표시되지만 listview는 새로 고쳐지지 않습니다. – kameny
ListFragments를 많이 사용하지는 않았지만 onBookSelected 콜백에 문제가 있다고 생각합니다. 거기에 두 번째 조각을 업데이트해야합니다. ViewPager는 처음 생성되었을 때 첫 번째 2 조각을 메모리에로드하고 두 조각 사이를 전환 할 수 있다는 사실은 작동 확인을 의미합니다. –
나는 당신에 동의합니다. ViewPagerDemoActivity.onBookSelected() 메서드에서 현재 단편을 가져 와서 목록을 수동으로 다시 채 보려고했습니다. mMyAdapter.getItem()을 사용하고 있지만이 메서드는 새로운 인스턴스를 반환합니다. 이것이 실제 문제입니다. FragmentStatePagerAdapter와 함께 시도했지만 작동하지 않습니다. – kameny