【发布时间】:2012-11-06 04:46:05
【问题描述】:
当您实现 SpinnerAdapter 时会得到 getDropDownView,它与需要扩展 BaseAdapter 时的 getView 有何不同。
【问题讨论】:
标签: android android-arrayadapter android-spinner baseadapter
当您实现 SpinnerAdapter 时会得到 getDropDownView,它与需要扩展 BaseAdapter 时的 getView 有何不同。
【问题讨论】:
标签: android android-arrayadapter android-spinner baseadapter
如果我们看下面的代码,我们在 getView 和 getDropDownView 中有 name 和 value 数组。
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和getDropDownView都实现时,前者获取name,后者获取value,静止的spinner将从中获取name getview 和下拉弹出框将获得 value。
【讨论】:
接受的答案似乎有点复杂,所以为简单起见
getView - 在用户按下
微调器,其中每个值视图都可以使用 convertView 参数进行调整
getDropDownView - 用户按下微调器后可以选择的值列表,其中列表中的每个值都可以使用 convertView 参数进行调整
【讨论】:
Views,而不是值。 getView() 用于您在点击 Spinner 之前看到的单个 View。 getDropDownView() 用于Views 的垂直堆栈,当您点击Spinner 时会看到该堆栈。您可以根据需要使用这两种方法来创建/填充两种类型的Views。
getView 和getDropDownView 可以显示不同的布局。
我创建了一个 Spinner 并使用 class ImageTextAdapter extends ArrayAdapter<String> 作为适配器。我覆盖了getView,这样它就可以同时显示ImageView 和TextView。但是,我不会覆盖 getDropDownView。
这是按下微调器之前的屏幕截图
在按下微调器之后。
我使用以下代码初始化微调器。
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;
}
}
【讨论】:
我们可以这样使用 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(),返回不同的视图,你会发现不同的。
【讨论】: