Tôi đang cố gắng tạo một ViewPager chứa 5 đoạn. 5 đoạn "container", vì vậy mỗi phần chứa 2 đoạn. 4 mảnh đầu tiên có cùng bố cục và thuộc cùng một lớp. Thứ năm là từ một lớp khác, và không có vấn đề với cái đó.ViewPager với nhiều phiên bản phân đoạn của cùng một lớp
Vấn đề là khi hoạt động khởi chạy, chỉ có 1 đoạn dường như hoạt động (một đoạn tại vị trí 0 trong viewPager). Tôi đã cố gắng trả về Fragment mới() tại vị trí 0 trong PagerAdapter của tôi, nhưng khi tôi làm điều đó, nó là mảnh thứ 2 đang hoạt động. (Bằng cách làm việc tôi có nghĩa là hiển thị danh sách bên trái, tôi vẫn chưa đưa về chăm sóc của các chi tiết mảnh ở bên phải)
Dưới đây là một số mã
CustomPagerAdapter.java
public class CustomPagerAdapter extends FragmentPagerAdapter{
public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
public CustomPagerAdapter(FragmentManager fm, Context context) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
if(pos == 4)
return new OtherContainerFragment();
else
return new ContainerFragment(pos);
}
@Override
public int getCount() {
return 5;
}
ContainerFragment java
public class ContainerFragment extends Fragment {
private int CONTAINER_TYPE;
public ContainerFragment(){
}
public ContainerFragment(int type){
CONTAINER_TYPE = type;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_container, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE);
ft.replace(R.id.replaceable_list, frag);
ft.commit();
CustomListFragment.java
public class CustomListFragment extends SuperCustomListFragment{
private ArrayList<Model> mModels;
private int TYPE;
public CustomListFragment(){
}
public CustomListFragment(int type){
TYPE = type;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mModels = new ArrayList<Model>();
if(TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL){
mAdapter = AppUtils.getJournalListAdapter(getActivity(), mModels);
new syncPapers().execute();
}else if(TYPE == AppConstants.FRAGMENT_TYPE_MOVIES){
mAdapter = AppUtils.getMoviesListAdapter(getActivity(), mModels);
new syncMovies().execute();
}
if(mAdapter != null)
mListView.setAdapter(mAdapter); //mListView is defined in the superClass
Sau đây là các hằng số tôi sử dụng:
public class AppConstants {
public static final int FRAGMENT_TYPE_AGENDA = 0; //so Fragment at position 0 should be of type agenda
public static final int FRAGMENT_TYPE_NEWS = 1; // position 1 should be of type news
public static final int FRAGMENT_TYPE_MOVIES = 2; // ...
public static final int FRAGMENT_TYPE_JOURNAL = 3; // ...
}
Và xml cho container:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/replaceable_list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</LinearLayout>
<LinearLayout
android:id="@+id/replaceable_details"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/background" >
</LinearLayout>
</LinearLayout>
SO mã này không hoạt động, có vẻ như danh sách trên còn lại trong đoạn container được thay thế trong mỗi đoạn, và chỉ mảnh ở vị trí 0 hiển thị nó. (Hiện tại, danh sách này hiển thị danh sách có bộ điều hợp loại "JOURNAL" nhưng sẽ hiển thị danh sách loại "AGENDA".
------------------- - * NHƯNG ... * --------------------
Nếu tôi tạo fragment_container bố trí tập tin khác nhau, và viết! NẾU điều kiện trong onCreateView và onViewCreated trong ContainerFragment.java, mọi thứ hoạt động tốt. Vì vậy:
ContainerFragme nt.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL)
return inflater.inflate(R.layout.fragment_container_journal, container, false);
else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES)
return inflater.inflater(R.layout.fragment_container_movies, container, false);
else
return super.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE);
if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL)
ft.replace(R.id.replaceable_journal_list, frag);
else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES)
ft.replace(R.id.replaceable_movies_list, frag);
else
return;
ft.commit();
Tôi đoán đó là vì trong mỗi đoạn, tôi thay thế LinearLayout của cùng một ID? (replaceable_list) Tôi nghĩ rằng có thể chia sẻ cùng một tệp bố cục cho mọi đoạn và không muốn tạo 4 tệp bố cục sẽ giống nhau. Nhưng có vẻ như tôi phải làm như vậy? Hoặc tôi có thiếu thứ gì đó ở đây không?
Cảm ơn bạn đã dành thời gian,
Bạn không chuyển vị trí chính xác đến đoạn của mình, hãy xem nhiều nhất được thăng hạng: http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment – cYrixmorten
Vâng tôi đã có đã thử trước khi đăng câu hỏi của tôi, nhưng nó cũng không hoạt động. Tôi nghĩ rằng nó liên quan đến việc sử dụng cùng một bố cục nhưng tôi muốn chắc chắn về nó. – Seb83
Ok, nó trông hơi cá với tôi với các mảnh lồng nhau. Như tôi đã hiểu, bạn nên thực hiện chuyển đổi trực tiếp trong getItem của CustomPagerAdapter, trả về đoạn bạn muốn hiển thị (và không thực hiện nhiều thay thế ở giữa). Bỏ qua hiệu quả phân đoạn vùng chứa. – cYrixmorten