Нужна помощь... Не получается самостоятельно разобраться с логикой кастом адаптера.
Использую Spinner
[syntax=java]
@Override
public View getView(int position, View layout, ViewGroup list) {
if(layout == null) {
LayoutInflater lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = lInflater.inflate(R.layout.item, list, false);
}
try {
Language lng = (Language) getItem(position);
TextView tv = (TextView) layout.findViewById(R.id.lngTitle);
Log.d("getView","Name tv="+lng.getId()+" uID="+lng.getIdAsInteger()+"LS=" + lng.getSupportedLanguageListString());
tv.setText(lng.getTitle());
} catch(Exception e){
e.printStackTrace();
}
return layout;
}
[/syntax]
Тут всё просто, создаем вью, отправляем его в лист. В логи выводим, какие параметры записанный будут в лист под данным вью.
[syntax=java]
OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> list, View layout, int position, long id) {
switch(list.getId()) {
case R.id.lLng:
Log.i("onItemSelected","LeftList");
break;
case R.id.rLng:
Log.i("onItemSelected","RightList");
break;
}
Log.d("onItemSelected", "id= " + ((Language)list.getItemAtPosition(position)).getId()
+ " title=" + ((Language)list.getItemAtPosition(position)).getTitle()
+ " tag=" + ((Language)list.getItemAtPosition(position)).getSupportedLanguageListString());
Log.d("onItemSelected","==================================");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO don't change
}
};
[/syntax]
Листа два, оба одинаковой структуры. Ставим на обоих прослушку. В логи выводим параметры item из листа, используя позицию.
Запускаем и смотрим логи(никуда не кликал, просто запуск аппликации):
Код: Выделить всё
05-05 13:44:46.718: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 13:44:46.726: D/getView(19803): Name tv=es uID=1 LS=en
05-05 13:44:46.921: I/onItemSelected(19803): LeftList
05-05 13:44:46.929: D/onItemSelected(19803): id= en title=English tag=es,ru
05-05 13:44:46.929: D/onItemSelected(19803): ==================================
05-05 13:44:46.929: I/onItemSelected(19803): RightList
05-05 13:44:46.929: D/onItemSelected(19803): id= es title=Spanish tag=en
05-05 13:44:46.929: D/onItemSelected(19803): ==================================
05-05 13:44:46.952: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 13:44:46.952: D/getView(19803): Name tv=es uID=1 LS=en
Уже что-то не понятное. Вот он создал как бы два листа с одним элементом(их больше) в каждый лист, и вывел их на экран. Допустим, логично, так как спинер показывает только один элемент в свёрнутом состоянии.
Сработала прослушка, хм.. хоть ничего еще не менял, но, допустим, он так инициализируется.
Но почему он снова вошел в getView?!? Опять создал по одному элементу, с теми же самыми параметрами для каждого списка, зачем дважды???
Кликнул на один из списков, он развернулся, смотрим логи:
Код: Выделить всё
05-05 14:07:24.437: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.437: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:07:24.444: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.444: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:07:24.483: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.483: D/getView(19803): Name tv=ru uID=2 LS=en
Всё верно, в листе две записи, отображено без ошибок.
Первый раз он зашел в getView что бы создать весь список, это логично.
Но что он там забыл второй и третий раз?!?
Выберу что-нибудь из списка, логи:
Код: Выделить всё
05-05 14:11:37.687: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 14:11:37.694: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:11:37.710: I/onItemSelected(19803): RightList
05-05 14:11:37.710: D/onItemSelected(19803): id= ru title=Russian tag=en
05-05 14:11:37.710: D/onItemSelected(19803): ==================================
С onItemSelected всё логично, сработал селект, получил данные.
А вот с getView снова не понятно, вторая запись логична, он свернул лист, и добавил один элемент в лист.
А вот первая запись, это из другого листа, который я вообще ниразу не трогал, зачем он пересоздал лист?!?