SpinnerAdapter中getView和getDropDownView的区别

68
当你实现SpinnerAdapter时,你会得到getDropDownView,它与需要扩展BaseAdapter时拥有的getView有什么不同。
4个回答

59
如果我们看一下以下代码,我们在getView和getDropDownView中有名字和值数组。
private void initView() {
    SpinnerDropDownAdapter sddadapter = new SpinnerDropDownAdapter(this);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, sddadapter.name);

    Spinner getViewSP = (Spinner) findViewById(R.id.getview_sp);
    getViewSP.setAdapter(adapter);

    Spinner getViewWDropDownSP = (Spinner) findViewById(R.id.getview_w_drop_down_sp);
    getViewWDropDownSP.setAdapter(sddadapter);
}

static class SpinnerDropDownAdapter extends BaseAdapter implements
        SpinnerAdapter {
    Context context;

    SpinnerDropDownAdapter(Context ctx) {
        context = ctx;
    }

    String[] name = { " One", " Two", " Three", " Four", " Five", " Six",
            " Seven", " Eight" };
    String[] value = { " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8" };

    @Override
    public int getCount() {
        return name.length;
    }

    @Override
    public String getItem(int pos) {
        // TODO Auto-generated method stub
        return name[pos];
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView text = new TextView(context);
        text.setTextColor(Color.BLACK);
        text.setText(name[position]);
        return text;
    }

    @Override
    public View getDropDownView(int position, View convertView,
            ViewGroup parent) {
        TextView text = new TextView(context);
        text.setTextColor(Color.BLACK);
        text.setText(value[position]);
        return text;
    }
}

如果没有实现 getDropDownView 方法,下拉框弹出窗口会从 getView 拿取视图。因此,它只会显示名称。

getView

当同时实现getView和getDropDownView时,前者获取名称,后者获取值,静止的下拉菜单将从getView获取名称,下拉弹出菜单将从getDropDownView获取值。 getView and getDropDownView

我们能否像简单的旋转器一样在这里得到视图? - stackoverflow
至少在我的情况下,如果没有实现getDropDownView方法,我会得到一个空的View。 - xarlymg89

58

接受的答案似乎有点复杂,所以为了简单起见

  • getView - 用户按下Spinner之前显示的值,在convertView参数的帮助下可以调整每个值的视图

  • getDropDownView - 用户按下Spinner后可以选择的值列表,在convertView参数的帮助下可以适应列表中的每个值


2
它们是View,而不是值。getView()是用于在Spinner被点击之前看到的单个ViewgetDropDownView()用于在Spinner被点击时看到的垂直堆栈View。您可以使用这两种方法根据需要创建/填充两种类型的View - ban-geoengineering

7

getViewgetDropDownView可以显示不同的布局。

我创建了一个Spinner并使用class ImageTextAdapter extends ArrayAdapter<String>作为适配器。我重写getView,以便它可以同时显示 ImageView TextView 。但是,我没有重写getDropDownView

这是下拉列表之前的屏幕截图:

enter image description here

这是下拉列表之后的屏幕截图:

enter image description here

我使用以下代码初始化了Spinner。

String[] spinnerTexts = {"Tanzania", "Thailand"};
int[] spinnerImages = {R.drawable.tanzania, R.drawable.thailand};

ArrayAdapter<String> adapter = new ImageTextAdapter(this, spinnerTexts, spinnerImages);

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);

这里是ImageTextAdapter.java文件。
public class ImageTextAdapter extends ArrayAdapter<String> {

    int[] images;

    public ImageTextAdapter(Context ctx, String[] texts, int[] images) {
        super(ctx, android.R.layout.simple_spinner_item, texts);
        this.images = images;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = getLayoutInflater().inflate(R.layout.row, parent, false);

        TextView textView = (TextView) row.findViewById(R.id.textView);
        textView.setText(getItem(position));

        ImageView imageView = (ImageView) row.findViewById(R.id.imageView);
        imageView.setImageResource(images[position]);

        return row;
    }
}

6
我们可以使用SpinnerAdapter来实现这一点:
public class FolderSpinnerAdpater extends BaseAdapter implements SpinnerAdapter {
@Override
public int getCount() {
    return 0;
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return null;
}
}

在BaseAdapter.java中。
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    return getView(position, convertView, parent);
}

重写 getView()getDropDownView() 方法,返回不同的视图,你会发现它们之间的差异。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接