在ArrayAdapter中重写getDropDownView时的样式问题

时间:2013-09-19 13:41:16

标签: android view android-arrayadapter android-spinner

在覆盖ArrayAdapter getDropDownView 方法时,我遇到了一种奇怪的行为。我需要覆盖此方法,以便从我的自定义对象中显示正确的字符串值。这就是我的阵列适配器的样子:

ArrayAdapter<NoteType> adapter = new ArrayAdapter<NoteType>(this, android.R.layout.simple_spinner_item, lstNoteTypes){
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView lbl = (TextView) super.getView(position, convertView, parent);
        lbl.setText(getItem(position).getName());
        return lbl;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView lbl = (TextView) super.getView(position, convertView, parent);
        lbl.setText(getItem(position).getName());
        return lbl;
    }
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

所以当我覆盖getDropDownView时,我的Spinner看起来如下 - 项目高度非常小,这不是我想要的:

enter image description here

但是当我评论(或者不要覆盖)getDropDownView方法时,它看起来没有默认样式,但是我无法将所需的文本值注入下拉项目。 enter image description here

请注意两个图片中项目的高度仅仅因为覆盖getDropDownView

有什么建议吗?或者我的代码中缺少什么?

4 个答案:

答案 0 :(得分:2)

如果您自己编写NoteType,请覆盖其中的toString()。只需将以下内容添加到NoteType类:

@Override
public String toString() {
    return getName();
}

答案 1 :(得分:2)

我认为我可能知道为什么会发生这种情况,但我必须对其进行测试,所以现在这是另一个(快速)解决方案。

由于SpinnertoString()中的每个对象ArrayAdapter调用toString(),您可以覆盖NoteType课程中的toString()方法并让它返回字符串(而不是默认的getDropDownView()实现)。这样您就不必在适配器中覆盖{{1}},但仍然具有默认样式和数据。

答案 2 :(得分:1)

我遇到了自定义BaseAdapter类的同样问题。这在注释中也有提及,但解决方案实际上非常简单 - 只需在从getDropDownView方法返回的TextView中添加填充。

你不需要为此添加任何额外的文件,我没有使用ActionBarSherlock(只是默认的Spinner),所以我认为它与此无关。以下是适合我的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Create custom TextView
    TextView lbl = (TextView) super.getView(position, convertView, parent);
    lbl.setText(getItem(position).getName());

    // Add padding to the TextView, scaled to device
    final float scale = context.getResources().getDisplayMetrics().density;
    int px = (int) (10 * scale + 0.5f);
    lbl.setPadding(px, px, px, px);

    return lbl;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    // Create custom TextView
    TextView lbl = (TextView) super.getView(position, convertView, parent);
    lbl.setText(getItem(position).getName());

    // Add padding to the TextView, scaled to device
    final float scale = context.getResources().getDisplayMetrics().density;
    int px = (int) (10 * scale + 0.5f);
    lbl.setPadding(px, px, px, px);

    return lbl
}

答案 3 :(得分:1)

必须做同样的事情,所以我自己的观点被用作checkedTextView

在这方面,最重要的是设置高度 的机器人:?layout_height =&#34; ATTR / dropdownListPreferredItemHeight&#34; 我使用的是基础适配器