2014-10-17 71 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

相关问题