2014-10-17 54 views
10

我有一個Android應用程序(在平板電腦上)使用主 - 細節流來顯示左側的預測列表以及右側的詳細信息。我希望能夠在應用程序加載時選擇第一項。在Cursor Loader中選擇ListView中的第一個項目

我在設置所選索引的onLoadFinished方法中有代碼。我實現了這一點,因爲有時用戶會選擇一個項目,如果他們改變了方向,它會被關閉。我用這下面的方法,以確保一旦它加載正確的再次選擇所選項目:

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mForecastAdapter.swapCursor(data); 

    // If we have a selected index - select it. 
    if(mSelectedIndex != ListView.INVALID_POSITION) { 
     mForecastListView.setSelection(mSelectedIndex); 
    } 
} 

我嘗試添加如果正在使用平板電腦,選擇第一項是檢查的else語句。該代碼已執行,但它似乎發生在實際加載listview和項目未被選中之前。應用程序打開後,我應該在哪裏放置代碼以選擇第一個項目?

編輯 這裏是我都試過了,沒有運氣的方法:

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mForecastAdapter.swapCursor(data); 

    // If we have a selected index - select it. 
    if(mSelectedIndex != ListView.INVALID_POSITION) { 
     mForecastListView.setSelection(mSelectedIndex); 
    } else if(mForecastAdapter.IsTwoPane()){ 
     mForecastListView.setSelection(0); 
    } 
} 
+0

您是否有交換而不是更改光標的原因? – 2014-10-21 04:24:45

+0

如果我沒有弄錯,我相信你在使用CursorLoader時需要使用它。不過,我認爲這與我需要做的事情無關。 – AdamMc331 2014-10-21 04:31:33

+0

交換和更改的功能稍有不同,前者保留前一個遊標而不關閉,而後者關閉前一個遊標並將其替換爲新遊標。 – 2014-10-21 04:45:09

回答

1

我會做到以下幾點,我已經做到了在一般列表視圖,應該使用光標工作了。

在適配器中,創建一個字段爲選定的位置

public int selectedPos = 0;//use setter/getter eventually 

現在確保了OnItemClickListener/OnItemSelectedListener您的ListView執行以下操作:

<YOUR_ADAPTER_INSTANCE>.selectedPos = positionSelected; 

最後,在getView()您的適配器,請執行以下操作:

if(position == selectedPos) { 
    //do what you want to show selection 
} else { 
    //do what you want for default state of the list items 
} 

這將確保當列表第一次顯示時,selectedPos將爲0,並且因此將根據以上選擇第一位置。

如果你想通過orientationChange和類似的東西來堅持你的用戶選擇,你只需要確保一旦你被「恢復」,你將信息傳遞給適配器。

+0

所以你不認爲代碼屬於onLoadFinished?或者它會破解在onLoadFinished中處理方向改變的東西(因爲這就是它的原理,我知道它的工作原理)並處理適配器中的默認選擇? – AdamMc331 2014-10-21 15:34:18

+0

OnLoadFinished應該只交換光標(或者像上面提到的那樣替換)......這應該會自動進行重新佈局。然後,選定的部分應按照我的建議進行處理。讓我知道。 – Hahn 2014-10-21 20:23:45

+0

沒有運氣。我需要onLoadFinished中的代碼來處理我想要的東西,getView沒有幫助。 – AdamMc331 2014-10-21 20:47:17

1

如果由於配置更改而試圖恢復列表視圖,可能保存狀態會有所幫助?例如:

private Parcelable mForceastListViewSavedState; 
private int mForecastListViewPositionSavedState; 
private static final String sForecastListViewSavedStateKey = "ForecastListViewSavedState"; 
private static final String sForecastListViewPositionSavedState = "ForecastListViewPositionSavedState"; 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if(mForecastListView != null){ 
     outState.putParcelable(sForecastListViewSavedStateKey, mForecastListView.onSaveInstanceState()); 
     outState.putInt(sForecastListViewPositionSavedState, mForecastListView.getFirstVisiblePosition()); 
    } 
    super.onSaveInstanceState(outState); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    ... 

    //Restore InstanceState 
    if (savedInstanceState != null){ 
     mForceastListViewSavedState = savedInstanceState.getParcelable(sForecastListViewSavedStateKey); 
     mForecastListViewPositionSavedState = savedInstanceState.getInt(sForecastListViewPositionSavedState); 
    } 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mForecastAdapter.swapCursor(data); 

    //Restore ListView State 
    if (mForceastListViewSavedState != null){ 
     mForecastListView.onRestoreInstanceState(mForceastListViewSavedState); 
     mForecastListView.setSelection(mForecastListViewPositionSavedState); 
    } 
} 
+0

我使用onSaveInstanceState來存儲選定的位置來處理方向更改。然後,在onLoadFinished()我調用集合選擇。這在用戶旋轉設備時起作用。出於某種原因,_當應用程序第一次打開時,setSelection(0)不會選擇第一項。 – AdamMc331 2014-10-27 23:51:36

1

我解決了這個問題,雖然這個問題已經過時了。我的解決方案是:

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader,Cursor cursor){ 

    mForecastAdapter.swapCursor(cursor); 
    if(mPositon!=ListView.INVALID_POSITION){ 
     mListView.smoothScrollToPosition(mPositon); 
    }else if(mTwoPane){ 
     { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        mListView.performItemClick(mListView, 0, mListView.getAdapter().getItemId(0));      } 
      }); 
     } 
    } 
} 
+0

這看起來像一個非常好的解決方案!我在一段時間內沒有觸及過我的代碼,但是如果在應用第一次打開時這個工作正常,你有沒有驗證過? – AdamMc331 2016-05-05 13:37:06

+0

它做得很好。通過使用這個,我解決了這個問題。此外,您應該判斷device.mTwoPane的狀態是您需要了解和使用的聲明。 – LiLin 2016-05-07 03:04:56

相關問題