【问题标题】:Custom spinner adapter's getDropDownView() acting inconsistently自定义微调器适配器的 getDropDownView() 行为不一致
【发布时间】:2018-01-18 18:50:59
【问题描述】:

我创建了一个自定义微调器适配器,以将自定义视图应用于我拥有的微调器的选定项目视图和下拉视图。这些的布局文件就是这样。

选中的项目视图

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerItem"
style="?android:attr/spinnerDropDownItemStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:textAppearance="@style/StandardText"
android:gravity="center"/>

下拉视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/firingcycleSpinnerItem"
style="?android:attr/spinnerDropDownItemStyle"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:gravity="center">

<CheckedTextView
    android:id="@+id/firingcycleName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="@style/SubtitleText"
    android:layout_gravity="center_vertical|left"
    />

<TextView
    android:id="@+id/firingcycleSubtitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="@style/SmallText"
    android:layout_gravity="center_vertical|left"
    android:layout_marginTop="8dp"
    />

</LinearLayout>

getDropDownView() 方法中,我尝试使用下面的代码对第一个下拉项设置不同的样式。

if (position == 0) {
        name.setTextColor(name.getHintTextColors());
        subtitle.setVisibility(GONE)
}

但是,由于某种原因,除了设置第一个元素的样式外,当前选定项的下拉视图也以相同的方式设置样式,就好像这段代码为其运行一样。

我已经插入了断点,并发现运行getDropDownView() 以在打开微调器时生成微调器中的每个元素。上面提供的代码部分确实只运行一次 - 在创建第一个元素时。

让我感到困惑的是,这个问题与所选项目的下拉视图有关。我还将自定义样式应用于getView() 中的第一个元素,它创建了微调器的选定项目视图。虽然我为此视图使用了不同的布局文件,但我运行与上面代码完全相同的检查,并且这种样式完美地工作。如果选择了第一个元素,则它的视图将被设置样式。如果选择了任何其他元素,它的视图完全没问题。

我尝试过应用不同的颜色,使用各种不同的检查来识别第一个元素,并切换布局。选中的item view依然完美,下拉item依然有问题。

如果我从getDropDownView() 中完全删除此代码,则每个元素(包括所选元素)看起来都相同,因此不会有其他代码在修改所选项目的下拉视图。我不知道此时可能是什么问题。

【问题讨论】:

    标签: java android spinner


    【解决方案1】:

    这是因为视图被回收,所以在下拉视图中,第一个视图会按预期进行修改,但如果它被关闭并重新打开,它可以在另一个位置使用相同的视图。要解决这个问题,您不能只更改视图,如果它在第一个位置,如果它不在第一个位置,您还需要将其更改回来例如:

    if (position == 0) {
        name.setTextColor(name.getHintTextColors());
        subtitle.setVisibility(GONE)
    }
    else {
        name.setTextColor(name.regularColor());
        subtitle.setVisibility(VISIBLE)
    }
    

    【讨论】:

    • 呵呵,我过去尝试过这样做,但没有成功。由于某种原因,这次它做到了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多