2013-07-23 45 views
12

Đây là một tình huống. Tôi muốn điều hướng từ Phân đoạn A-> B-> C.Cách lưu trạng thái Fragment có listview

Trong phần B Fragment có listview. Khi nhấp vào mục tôi mở khung nhìn chi tiết C Fragment. ofcourse tôi đã sử dụng phương pháp thay thế và thêm addtoBackStack (null) trong khi transactiong từ B đến C sao cho Back nhấn nó trở về B.

Mọi thứ suôn sẻ. Nhưng khi tôi trở lại B từ C, chế độ xem đang được làm mới và do đó webservice đang được gọi lại. Tôi không muốn làm điều này. Tôi muốn giữ trạng thái B Fragment với listview.

Tôi đã nhận được một số bài đăng về Phiên bản còn lại, nhưng nó không giúp ích nhiều.

Bất kỳ giúp đỡ được nhiều đánh giá cao.

Cảm ơn.

+0

Bạn đã xem xét sử dụng 'Bundle' và Overriding' onSavedInstance() '? – BC2

+0

Hi @ dakshbhatt21, bạn có nhận được giải pháp cho vấn đề của mình không? Tôi có cùng một vấn đề, nó đã làm tôi thất vọng trong một tuần không có bước đột phá nào. –

+0

hi @mungaihkamau hãy kiểm tra bài viết này http://developer.android.com/training/implementing-navigation/index.html, bạn có thể tìm thấy nhiều loại điều hướng khác nhau khi làm việc với các đoạn, chỉ cần kiểm tra và cho tôi biết. – dakshbhatt21

Trả lời

12

Như được giải thích here bạn có thể sử dụng onSaveInstanceState() để lưu dữ liệu trong Gói và truy xuất dữ liệu đó trong phương thức onRestoreInstanceState().

Thường setRetainState (đúng) được đề cập như cách để giữ trạng thái ui trong phân đoạn, nhưng nó không hoạt động cho bạn vì bạn đang sử dụng backstack.

Vì vậy, một cách tốt để bạn có thể lưu các scrollposition trong onSaveInstanceState() và khôi phục lại nó trong onRestoreInstanceState() như thế này:

public class MyListFragment extends ListFragment { 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    int index = this.getListView().getFirstVisiblePosition(); 
    View v = this.getListView().getChildAt(0); 
    int top = (v == null) ? 0 : v.getTop(); 

    outState.putInt("index", index); 
    outState.putInt("top", top); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    [...] 
    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
     index = savedInstanceState.getInt("index", -1); 
     top = savedInstanceState.getInt("top", 0); 
    } 
    if(index!=-1){ 
    this.getListView().setSelectionFromTop(index, top); 
    } 

} 

Hơn nữa bạn có thể tìm thấy một ví dụ tương tự chi tiết hơn here.

+1

+1 Nó thực sự hoạt động GREATE :) –

+0

@alex Nó không làm việc cho tôi. Tôi đã listview trong nút tìm kiếm (nút thanh dưới cùng). Chế độ xem danh sách của tôi sẽ được tạo lại khi tôi nhấp vào nút tìm kiếm bên dưới. Tôi không thể lưu trạng thái của listview. Giúp tôi .. –

+0

Bạn có thể vui lòng đăng bố cục xml của mình và hiển thị mã của bạn không. Nó có thể là tốt hơn để bắt đầu một câu hỏi mới, để làm như vậy và liên kết chuỗi câu hỏi này là "tương tự" – alex

0

bạn có thể lưu xác định ui của bạn khi khởi động. khi ở chế độ onCreateView, chỉ thêm bố cục đó. để trạng thái xem có thể tiết kiệm hoàn hảo.

đây là sv của tôi:

trong onCreate

LayoutInflater inflater = (LayoutInflater) 
      ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.pulltorefreshgridview, null); 
    mPullRefreshGridView = (PullToRefreshGridView) view 
      .findViewById(R.id.listcate_pullrefresh_gridview); 

văn bản mạnh mẽ trong onCreateView

if (rootView != null) ((LinearLayout)rootView).removeAllViews(); 
View v = inflater.inflate(R.layout.listcate_fragment, container, false); 
rootView = v; 


    ((LinearLayout) v).addView(mPullRefreshGridView, 
      new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT, 
        LinearLayout.LayoutParams.FILL_PARENT)); 
0

Tôi nghĩ rằng bạn có thể lưu vị trí của ListView của bạn chỉ cần trước khi bạn rời khỏi mảnh B. Có thể làm điều đó trong đoạn B onStop(). Và khi bạn quay trở lại, bạn có thể lấy vị trí đó và khôi phục nó về ListView, thực hiện điều đó ví dụ trong đoạn B onStart(). Dữ liệu vị trí có thể được lưu tại Hoạt động, vì vậy nó sẽ không bị mất ngay cả khi phân đoạn bị tách rời.

Một điều cần lưu ý là (Tôi đã bị bẫy bởi điều này), nếu dữ liệu vị trí đã lưu được cập nhật bởi dịch vụ nền, bạn nên tránh khôi phục dữ liệu đó vào ListView trước giai đoạn vòng đời onStart() của mảnh B, bởi vì trên thực tế, khung công tác sẽ lưu trạng thái của khung nhìn ngay trước khi rời khỏi mảnh và khôi phục nó khi quay trở lại. Vì vậy, nếu bạn khôi phục lại vị trí của mình trước khi khung làm điều đó, dữ liệu khôi phục của khung công tác sẽ ghi đè lên vị trí của bạn.

2

Tôi đã giải quyết vấn đề này bằng cách tạo Bộ điều hợp của tôi trên onCreate() thay vì onCreateView().

Điều này là do (tôi nghĩ) đoạn được thêm vào hậu trường bị mất Chế độ xem của nó và sau đó nó phải tạo lại chế độ xem. onCreateView() được gọi và tạo lại một cách ngẫu nhiên adapter của bạn.

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