8

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,

+0

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

+0

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

+0

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

Trả lời

7

Tôi có thể giải quyết vấn đề này bằng cách đặt id của bố cục được thổi phồng trong mỗi đoạn đến vị trí của nó.

Những gì bạn sẽ phải làm chỉ đơn giản là thay đổi phương pháp onCreateView trong bạn lớp ContainerFragment tới:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_container, container, false); 
    v.setId(CONTAINER_TYPE) 
    return v; 

này hoạt động vì cách thực hiện FragmentPagerAdapter xử lý thẻ mảnh.

13

Mặc dù một phản ứng rất muộn nhưng tôi đã phải đối mặt với cùng một loại vấn đề và tôi cố định vấn đề này bằng cách sử dụng

getChildFragmentManager().beginTransaction() 

thay vì

getActivity().getSupportFragmentManager().beginTransaction() 

Như trong trường hợp này, chúng tôi đang cố gắng để thực hiện giao dịch từ bên trong một mảnh (một trong danh sách các mảnh được gắn vào ViewPager, do đó Activity hoạt động với ViewPager) vì vậy chúng ta phải sử dụng getChildFragmentManager() ở đây để có kết quả mong muốn.

Các vấn đề liên quan