2

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

代码:

/**

* Cusrom 微调器类 - 打开时始终关注第一项 * */ 类 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;
}

}

4

3 回答 3

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 类。

于 2012-10-19T09:03:49.210 回答
0

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

因此,如果发生这种情况,请尝试在 onCreate 之后调用 onWindowFocused 或其他任何调用

于 2012-10-16T12:53:50.250 回答
0

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

Spinner s = (Spinner) findViewById(R.id.spinner_id);
int i = adapter.getPosition("blue");
s.setSelection(i);
于 2012-10-17T16:58:57.900 回答