2011-04-21 50 views
2

在我的应用程序中,我有一个Spinner,可以填充两个Array s的Strings,存储在我的values/strings.xml资源中。根据两个RadioButton的状态,选择正确的Array的值,并且我的Spinner被填充。带文本和图标的微调框

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

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

我已经在互联网上搜索了一个很好的教程,但是我发现我没有成功做到这一点。我刚刚开始使用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); 

当单选按钮中的一个被选中,我用下面的事件处理代码:

// 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); 
} 

我制作了一个基于的自定义适配器3210,但我有种在这纠结......我需要一些帮助:

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; 
    } 

} 

这是我希望它看起来像:

Result

回答

4

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

UPDATE

尝试以下。我没有测试过代码,但我认为它应该可以这样工作。

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; 
    } 
} 
+1

是的,文本和图标,自定义适配器和几个getText()和setText()附件方法的线性布局。还有一个彻底的教程(列表,但是相同的概念)在这里:http://www.anddev.org/iconified_textlist_-_the_making_of-t97.html – Aleadam 2011-04-21 12:53:25

+0

我已经尝试过这个教程,但我仍然有点纠结于我的两个阵列......你会介意帮助我吗?提前致谢 – Hannelore 2011-04-21 13:12:45

+0

目前有什么问题?正如我在你看到的编辑问题,你已经在你的适配器中访问这两个数组。 label.setText(作业[位置]);和String uri =“@ drawable/a”+ jobsid [position]; – Flo 2011-04-21 14:04:21