当前位置: 首页 > 知识库问答 >
问题:

Android Spinner不显示额外项目的文本

从建明
2023-03-14

编辑:发现问题是由于材料旋转库。当我使用AppCompatSpinner时,它工作得很好。

上下文:我在摆弄这个材料旋转器库。我扩展了ArrayAdapter,这样我就可以向它添加一个额外的项目(我希望将来最终将其转换为“add New item”按钮)。

问题:适配器正确地膨胀了额外的TextView。它可以很好地检测文本的宽度。问题是文本本身没有出现。

尝试:我推测问题可能是由于文本颜色的原因,所以我将主题改为浅色(希望文本颜色显示为黑色),但这没有起作用。我还尝试将extcolor设置为color.white,但这也不起作用。然后我尝试使用colors.xml中的颜色,但当然没有效果。我试着把alpha设为1,但没有用。

不确定问题是什么,所以我将在下面发布我的代码。

自定义适配器

public class TaskArrayAdapter extends ArrayAdapter<Task> {

public static final int VIEW_TYPE_ADD_ITEM = -1;
private static final int OFFSET = 1; // # of other view types

private List<Task> mTasks;

public TaskArrayAdapter(Context context, int resource, List<Task> tasks) {
    super(context, resource, tasks);
    mTasks = tasks;
}

@Override
public int getViewTypeCount() {
    //Workaround waiting for a Google correction (https://code.google.com/p/android/issues/detail?id=79011)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        return 1;
    }
    return super.getViewTypeCount();
}

@Override
public int getItemViewType(int position) {
    position = position - OFFSET;
    return (position == -1) ? VIEW_TYPE_ADD_ITEM : super.getItemViewType(position);
}

@Override
public int getCount() {
    return OFFSET + super.getCount();
}

@Override
public Task getItem(int position) {
    position = position - OFFSET;
    return (position == -1) ? null : super.getItem(position);
}

@Override
public long getItemId(int position) {
    position = position - OFFSET;
    return (position == -1) ? 0 : super.getItemId(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (getItemViewType(position) == VIEW_TYPE_ADD_ITEM) {
        final LayoutInflater inflater = LayoutInflater.from(getContext());
        final int resid = android.R.layout.simple_spinner_item;
        final TextView textView = (TextView) inflater.inflate(resid, parent, false);
        textView.setText("Testing Add New Item Here");
        textView.setTextColor(Color.WHITE);
        textView.setTag(VIEW_TYPE_ADD_ITEM);
        return textView;
    }
    return super.getView(position, convertView, parent);
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    if (getItemViewType(position) == VIEW_TYPE_ADD_ITEM) {
        final LayoutInflater inflater = LayoutInflater.from(getContext());
        final int resid = android.R.layout.simple_spinner_dropdown_item;
        final TextView textView = (TextView) inflater.inflate(resid, parent, false);
        textView.setText("Testing Add New Item Here");
        textView.setTextColor(Color.WHITE);
        textView.setTag(VIEW_TYPE_ADD_ITEM);
        return textView;
    }
    return super.getDropDownView(position, convertView, parent);
}

}

设置适配器

public void showTasks(List<Task> tasks) {
    final TaskArrayAdapter taskAdapter = new TaskArrayAdapter(this.getActivity(), android.R.layout.simple_spinner_item, tasks);
    taskAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mTaskSpinner.setAdapter(taskAdapter);
}

旋转器:

<com.example.test.MaterialSpinner
        android:id="@+id/task_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="12dp"
        android:layout_marginEnd="12dp"
        android:paddingStart="8dp"
        android:paddingEnd="8dp"
        android:textAlignment="center"
        app:ms_multiline="false"
        app:ms_enableFloatingLabel="false"
        app:ms_enableErrorLabel="false"
        app:ms_floatingLabelText="floating label"
        app:ms_baseColor="@color/transparent_blue"
        app:ms_highlightColor="@color/md_purple_400"
        app:ms_errorColor="@color/error_color"
        app:ms_thickness="2dp"
        app:ms_alignLabels="false"/>

共有1个答案

蒋承教
2023-03-14

我运行了你的代码,它对我来说很好。

getView用于单击旋转器之前显示的视图getDropdownView用于弹出窗口出现时重复的视图。

因此您可能不希望getView()中包含getItemViewType代码

你能显示你的主题/风格可能影响旋转器吗?

 类似资料:
  • 我有一个UITabBarController的UITableView。当视图首次显示时,桌面视图在顶部显示额外的填充。当我切换到另一个标签,然后回来。它似乎在正确的位置。 所以我的问题是如何去除这个烦人的填充物,让它远离。 我尝试过的内容(但可能不正确): 取消酒吧等下的选项... 使表标题和视图大小为0.01f,并尝试使用nil和0。 可能还有上千种情况,但我遇到的堆栈溢出最多 问题截图: 问题

  • 问题内容: 我将现有的项目源代码从SVN中检出到系统中的文件夹中。然后我打开了日食。导入项目->现有Maven项目。 它导入没有问题。但是,Project Explorer将其显示为仅文件夹而不是软件包。(就像我们创建一个包然后向其添加类时,它为包根显示一个不同的图标)。我也打开了Navigator和Package Explorer。但是他们也将它们显示为文件夹。 我试过了: 在项目的根源上。但这

  • 问题内容: 我与几个工作被设置为s ,并有一组和。在HTML中,如果在每行之后都有一个换行符,则会在div的右侧和底部自动添加5px的边距。 例: 是否有我忽略的属性可以让我重置自动保证金? 更新资料 从我发现的结果来看,没有任何方法可以消除空白…除非您将所有内容都放在同一行,或者添加注释以注释掉换行符。例: 这不是最佳的解决方案,但是如果您有多行代码,则仍然更易于阅读。 问题答案: div被视为

  • 问题内容: 我正在从JSON文件“ new.json”中获取一些数据,我想过滤一些数据并将其存储到新的JSON文件中。这是我的代码: 我收到一个错误,回溯是: 有人能帮我吗? 这是new.json中数据的示例,文件中还有约1500种这样的词典 问题答案: 如以下示例所示,(和)不会解码多个json对象。 如果要转储多个词典,请将它们包装在列表中,然后转储列表(而不是多次转储词典)

  • 这是我现在面临的一个奇怪的问题。从我的应用程序中,我从JSON文件中从链接中获取数据,然后用Volley解析它。现在我想在一个看起来不起作用的RecyclerView上显示数据,我很高兴我的代码很好,但是有些东西似乎不起作用,我找不到它。 这是活动代码 HomeActivity.java: 这是我从适配器中扩展的布局,并从JSON文件中设置数据 和适配器类相关的代码,我猜: @Override p

  • 我有一个AutocompleteTextView,它工作得很好。当我写入一个word时,它会显示相关的结果,但我想在AutoCompleteTextView中显示所有项,而不写入任何word。我怎么能那么做。