【问题标题】:Difference between getView & getDropDownView in SpinnerAdapterSpinnerAdapter 中 getView 和 getDropDownView 的区别
【发布时间】:2012-11-06 04:46:05
【问题描述】:

当您实现 SpinnerAdapter 时会得到 getDropDownView,它与需要扩展 BaseAdapter 时的 getView 有何不同。

【问题讨论】:

    标签: android android-arrayadapter android-spinner baseadapter


    【解决方案1】:

    如果我们看下面的代码,我们在 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

    【讨论】:

    • 我们可以像简单的微调器一样在这里查看吗?
    • 至少在我的情况下,如果 getDropDownView 没有实现,我会得到一个空视图。
    【解决方案2】:

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

    • getView - 在用户按下 微调器,其中每个值视图都可以使用 convertView 参数进行调整

    • getDropDownView - 用户按下微调器后可以选择的值列表,其中列表中的每个值都可以使用 convertView 参数进行调整

    【讨论】:

    • 它们是Views,而不是值。 getView() 用于您在点击 Spinner 之前看到的单个 ViewgetDropDownView() 用于Views 的垂直堆栈,当您点击Spinner 时会看到该堆栈。您可以根据需要使用这两种方法来创建/填充两种类型的Views。
    【解决方案3】:

    getViewgetDropDownView 可以显示不同的布局。

    我创建了一个 Spinner 并使用 class ImageTextAdapter extends ArrayAdapter&lt;String&gt; 作为适配器。我覆盖了getView,这样它就可以同时显示ImageViewTextView。但是,我不会覆盖 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;
        }
    }
    

    【讨论】:

      【解决方案4】:

      我们可以这样使用 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(),返回不同的视图,你会发现不同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 2011-02-17
        • 2016-10-18
        相关资源
        最近更新 更多