#android #text #icons #spinner
#Android #текст #Значки #вертушка
Вопрос:
В моем приложении у меня есть Spinner
, которое можно заполнить двумя Array
символами Strings
, хранящимися в моем values/strings.xml
ресурсе. В зависимости от состояния двух радиокнопок выбираются значения из правильного массива, и мой счетчик заполняется.
Для каждого массива строк у меня есть массив значков одинакового размера. Все мои значки начинаются с буквы «А» и сопровождаются цифрой. Я не могу это изменить, в таком виде это хранится в базе данных. У меня есть массив в Strings.xml со всеми числами, которые мне требуются для рисования значков. Все актуальные значки можно найти в drawable
папке ресурсов.
Теперь я хочу показать соответствующий элемент рядом со строкой из списка, которая была выбрана счетчиком. Когда элемент выбирается, мне просто нужно увидеть текст.
Я искал в Интернете хороший учебник, но с тем, что я нашел, мне не удалось это сделать. Я только начинаю программировать на 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);
}
Я создал пользовательский адаптер на основе этого руководства, но я немного запутался в нем… Мне нужна помощь:
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;
}
}
Я бы хотел, чтобы это выглядело именно так:
Ответ №1:
Вам необходимо реализовать пользовательский адаптер и определить пользовательский макет для элементов списка. Ознакомьтесь с этим руководством.
Обновить
Попробуйте следующее. Я не тестировал код, но думаю, что он должен работать именно так.
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(). Здесь есть еще одно подробное руководство (по спискам, но с той же концепцией): anddev.org/iconified_textlist_-_the_making_of-t97.html
2. Я пробовал использовать руководство, но я все еще немного запутался со своими двумя массивами… не могли бы вы мне помочь? Заранее большое спасибо
3. В чем проблема на данный момент? Как я вижу в отредактированном вами вопросе, вы уже получаете доступ к обоим массивам из своего адаптера. label.setText(задания[позиция]); и uri строки = «@drawable/a» jobsid[позиция];
4. Я не знаю, как передать массив со значками в arrayadapter. Я могу передать один массив, а не два… Когда я запускаю этот код, я получаю следующую ошибку: pastebin.com/5JRPEnLt
5. Я думаю, вам нужно реализовать это поведение в методе getView () вашего адаптера. На данный момент getView () и getDropDownView () оба вызывают getCustomView(), поэтому элементы всегда выглядят одинаково, независимо от того, находится счетчик в режиме выпадающего списка или нет. Итак, в вашем случае каждый из обоих методов нуждается в собственной реализации. getDropDownView() может просто вызвать метод getCustomView(), но в методе getView() вы должны скрыть значок.