ActionbarSherlock列表导航 - 滚动到顶部/焦点第一行

时间:2012-10-12 10:59:40

标签: android actionbarsherlock

我需要一些有关sherlock列表导航的帮助。 目标:当您打开导航时,我希望滚动到顶部/焦点到第一行,因此第一项始终可见。 问题:现在当列表中有更多项目时,屏幕可以显示(通常是横向模式),当我选择第4项然后打开列表时,第一项是不可见的,它集中于最后选择的项目。 它适用于我自定义微调器中的代码,但是当我尝试在IcsSpinner中覆盖相同的方法时它没有用。

代码:

/**

* Cusrom微调器类 - 打开时始终专注于第一项  *  * / class CustomSpinnerSelection扩展Spinner {

private boolean mToggleFlag = true;

//some constructors here

@Override
public int getSelectedItemPosition() {
    // this toggle is required because this method will get called in other
    // places too, the most important being called for the
    // OnItemSelectedListener
    if (!mToggleFlag) {
        return 0; // get us to the first element
    }
    return super.getSelectedItemPosition();
}

@Override
public boolean performClick() {
    // this method shows the list of elements from which to select one.
    // we have to make the getSelectedItemPosition to return 0 so you can
    // fool the Spinner and let it think that the selected item is the first
    // element
    mToggleFlag = false;
    boolean result = super.performClick();
    mToggleFlag = true;
    return result;
}

}

3 个答案:

答案 0 :(得分:1)

有一种可能的方法,现在您已经使用微调器完成了它。

您可以对操作栏使用自定义视图,其中包含用于列表导航的微调器,并使用自定义微调器类而不是默认微调器。

自定义视图xml可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

    <Spinner
    android:id="@+id/actionBarSpinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:entries="@array/default_list" />

</LinearLayout>

您需要从代码中启用和设置自定义视图。

View view = this.getLayoutInflater ().inflate (R.layout.actionbar_customview, null);
actionBar.setCustomView (view);
actionBar.setDisplayShowCustomEnabled (true);

此外,您可以保存微调器以设置任何侦听器或执行任何其他操作。

Spinner actionBarSpinner = ((Spinner) view.findViewById (R.id.actionBarSpinner));

而不是Spinner,它将是您的CustomSpinner类。

答案 1 :(得分:0)

我不确定这是不是你的情况,但我发现有关旋转器的一件事:有时如果你在onCreate()上填充它们,会发生一些低级别的棘手问题。请记住,Android是基于事件的,因此将数据放入onCreate实际上可能不会填充微调器。在绘制屏幕后,微调器有时会被填满!

所以,如果发生这种情况,请尝试在onCreate之后进行调用,例如onWindowFocused或其他任何名称

答案 2 :(得分:0)

setSelection可能是加载第一个项目聚焦的微调器的唯一方法。试试这个:

Spinner s = (Spinner) findViewById(R.id.spinner_id);
int i = adapter.getPosition("blue");
s.setSelection(i);