【问题标题】:Spinner with Text and Icons带有文本和图标的微调器
【发布时间】:2011-04-21 12:24:31
【问题描述】:

在我的应用程序中,我有一个Spinner,可以用Strings 中的两个Arrays 填充,存储在我的values/strings.xml 资源中。根据两个 RadioButtons 的状态,选择正确数组中的值并填充我的 Spinner。

对于每个字符串数组,我都有一个大小相同的图标数组。我所有的图标都以“A”开头,后跟一个数字。我无法更改它,它像那样存储在数据库中。我在 Strings.xml 中有一个数组,其中包含绘制图标所需的所有数字。所有实际图标都可以在drawable 资源文件夹中找到。

现在我想在由 Spinner 选择的列表中的字符串旁边显示相应的项目。当一个项目被选中时,我只需要查看文本。

我已经在 Internet 上搜索了一个很好的教程,但是我发现我并没有成功地做到这一点。我刚开始使用 Android 编程,所以我想我需要一点帮助。我希望有人能指导我正确的方向。

我将我的字符串数组放在实际的数组中,例如:

// Arrays with each function in text
arbeiderjobs = getResources().getStringArray(R.array.arbeiders);
bediendejobs = getResources().getStringArray(R.array.bediende);

// Arrays with each function ID
arbeiderjobsid = getResources().getIntArray(R.array.arbeidersid);
bediendejobsid = getResources().getIntArray(R.array.bediendeid);

当其中一个 RadioButtons 被选中时,我使用以下事件处理程序代码:

// RadioButton 'Arbeider': If a value gets chosen in this list, 
// the corresponding ID is put in the below variable 
RadioButton rbArbeider = (RadioButton) findViewById(R.id.rbArbeider);
rbArbeider.setOnCheckedChangeListener(new OnCheckedChangeListener() 
{
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
  {
    if (isChecked)
    {
      showSpinner(arbeiderjobs, R.id.cmbFuncties);
      s.setOnItemSelectedListener(new OnItemSelectedListener() 
      {
        public void onItemSelected(AdapterView<?> parentView, 
                                   View selectedItemView, int position, long id)
        {
          functie = arbeiderjobsid[position];
          statuut = 1;
          visible = false;  
        }
      });

      visible = true;
    }
  } // s.setOnItemSelectedListener

}); // rbArbeider.setOnCheckedChangeListener

这是我的showSpinner 方法:

private void showSpinner(String [] jobs, int id)
{    
  MyCustomAdapter adapter = new MyCustomAdapter
  (
    FindJob.this, 
    R.layout.spinnerrow, 
    jobs
  );

  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

  for (int i = 0; i < jobs.length; i++)
  {
    adapter.add(jobs[i]);
  }

  Spinner s = (Spinner) findViewById(id);
  s.setClickable(true);
  s.setAdapter(adapter);
}

我已经根据this tutorial 制作了一个自定义适配器,但我有点纠结...我需要一些帮助:

public class MyCustomAdapter extends ArrayAdapter<String>
{

  public MyCustomAdapter(Context context, int textViewResourceId, 
                         String[] objects) 
  {
    super(context, textViewResourceId, objects);
  }

  @Override
  public View getDropDownView(int position, View convertView, ViewGroup parent) 
  {
    return getCustomView(position, convertView, parent, 
                         arbeiderjobs, arbeiderjobsid);
  }

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

  public View getCustomView(int position, View convertView, ViewGroup parent,                                                         
                            String jobs[], int jobsid[]) 
  {
    // return super.getView(position, convertView, parent);

    LayoutInflater inflater = getLayoutInflater();
    View row = inflater.inflate(R.layout.spinnerrow, parent, false);
    TextView label = (TextView) findViewById(R.id.functie);
    label.setText(jobs[position]);

    ImageView icon = (ImageView) row.findViewById(R.id.icon);

    String uri = "@drawable/a" + jobsid[position];
    int imageResource = getResources().getIdentifier
    (  
      uri, 
      null, 
      getPackageName()
    );
    icon.setImageResource(imageResource);

    if (visible)
    {
      icon.setVisibility(View.GONE);
    }

    return row;
  }

}

这就是我想要的样子:

【问题讨论】:

    标签: android text icons spinner


    【解决方案1】:

    您需要实现自定义适配器并为列表项定义自定义布局。 Check this tutorial

    更新

    试试下面的。我还没有测试过代码,但我认为它应该像那样工作。

    public class MyCustomAdapter extends ArrayAdapter<String>{
    
        private String[] mIcons;
    
        public MyCustomAdapter(Context context, int textViewResourceId,
        String[] objects, String[] icons) {
            super(context, textViewResourceId, objects);
            mIcons = icons;
        }
    
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }
    
        public View getCustomView(int position, View convertView, ViewGroup parent) {
    
           LayoutInflater inflater=getLayoutInflater();
           View row=inflater.inflate(R.layout.spinnerrow, parent, false);
           TextView label=(TextView) findViewById(R.id.functie);
           label.setText(getItem(position);
    
           ImageView icon=(ImageView)row.findViewById(R.id.icon);
    
           String uri = "@drawable/a" + mIcons[position];
           int imageResource = getResources().getIdentifier(uri, null, getPackageName());
           icon.setImageResource(imageResource);
    
           return row;
        }
    }
    

    【讨论】:

    • 是的,带有文本和图标的线性布局、自定义适配器以及几个 getText() 和 setText() 辅助方法。这里还有另一个详尽的教程(针对列表,但概念相同):anddev.org/iconified_textlist_-_the_making_of-t97.html
    • 我已经尝试过本教程,但我仍然对我的两个数组有点纠结......你介意帮助我吗?提前非常感谢
    • 目前有什么问题?正如我在您编辑的问题中看到的那样,您已经从适配器中访问了这两个数组。 label.setText(工作[职位]);和字符串 uri = "@drawable/a" + jobid[position];
    • 我不知道如何将带有图标的数组传递给arrayadapter。我可以传递一个数组,而不是两个......当我运行此代码时,我收到以下错误:pastebin.com/5JRPEnLt
    • 我认为您必须在适配器的 getView() 方法中实现此行为。目前 getView() 和 getDropDownView() 都调用 getCustomView(),因此无论微调器是否处于下拉模式,项目看起来总是相同的。因此,在您的情况下,这两种方法中的每一种都需要自己的实现。 getDropDownView() 可以简单地调用 getCustomView() 方法,但是在 getView() 方法中你必须隐藏图标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多