1

目前我有一個活動,setContentView的佈局,其中包含一個listfragment。基本上它加載一個列表視圖。轉動片段與微調,活動結構

我的操作欄包含一個微調器,可以讓我加載不同的列表。我可以在後臺加載列表對象,並在用戶使用微調器選項切換到這些列表時更新一個片段的適配器。但是這不會保留用戶滾動到的位置。

我想加載多個listfragments,當用戶選擇一個不同的spinner選項時,會發生一個片段事務,它顯示與該特定列表關聯的其他listfragments之一。

我該怎麼做,以及如何修改我的主機活動?

我看到的例子FragmentTransaction涉及在主機活動的onCreate方法中創建所有片段,並且XML中沒有片段。現在我在XML中有一個片段,需要創建兩個實際上完全相同的ListFragments。

洞察理解

回答

1

看樣子你可以通過編程從here滾動的ListView:

對於直接/平分別滾動:

getListView().setSelection(21); 

getListView().smoothScrollToPosition(21); 

在ListView的getView方法,你可以記錄最近查看的位置呈現

@Override 
public View getView(int position, View arg1, ViewGroup arg2) { 
// TODO Auto-generated method stub 

因此,當您重置您的列表視圖時,您可以滾動到用戶所在的前一個位置,只需保留滾動位置的整數記錄。

我意識到你也在考慮片段解決方案。我知道「替換」方法會導致替換的片段破壞它的視圖(至少這是「支持」片段如何處理它)。因此,在這種情況下,您仍然返回到失去滾動狀態的列表視圖。您可以嘗試隱藏/顯示片段交易,因爲它們可能保留其視圖,並因此滾動狀態。

如果你確實嘗試了hide/show告訴我結果:)如果它有效,我可以自己使用它。

+0

我不知道替換方法會殺死片段。由於獲取listview的當前位置比較容易,我可能會在我正在處理的應用程序中使用該路線 – CQM

+0

,我不使用backstack作爲我的碎片...所以我不確定它是否會保留它;我確實看到了叫做destroyView。 – NameSpace

2

你看到在OnCreate添加片段()方法,而不是將它們直接在XML是因爲被包含在XML中的片段不能被刪除/修改的理由。如果你必須有這個片段並且想要加載其他片段,你可以將容器(如LinearLayout,RelativeLayout等)添加到父容器中,然後通過代碼動態設置它們的屬性。一個例子是:

LinearLayout layoutD = new LinearLayout(this); 
layoutD.setId(R.id.layoutd); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1); 
layoutD.setLayoutParams(params); 
layoutD.setOrientation(LinearLayout.VERTICAL); 
parent.addView(layoutD); // parent is a reference to the parent widget in the XML 
getSupportFragmentManager.beginTransaction().add(R.id.layoutd, your_fragment_here).addToBackStack(null).commit(); 

希望這會有所幫助。

+0

這可能會更好地回答我的問題,以防其他人來這裏發現類似的片段相關問題。但@ NameSpace的答案更好地解決了我的問題 – CQM