2012-05-18 3 views
5

У меня есть 4 TextViews, 2 ImageViews, 2 и 2 виджетов, которые являются частью определения строки в ListView. Данные поступают из XML и SimpleAdapter. Для доступа к этим TextViews я реализую ViewBinde r в пользовательском классе и переопределяю setViewValue. Это работает, и два TextViews, которые я хочу динамически изменять, обрабатываются в setViewValue. Что меня смущает, так это то, что мои другие два TextView не проходят через setViewValue. Я говорю об этом, основываясь на установке точки останова, где поток выполнения вводится только дважды. Я ожидал увидеть его 4 или более раз?Лучшее понимание ViewBinder для SimpleAdapter

Вот setViewValue, где у меня есть точка останова.

@Override  
public boolean setViewValue(View view, Object data, String text) 
{ 
    if(view.getId() == R.id.txtvw1) 
    {    
//blah do some stuff 
    } 
    else if (view.getId() == R.id.txtvw2) 
    { 
//Blah do some stuff 
    } 

    return true; 
} 

XML декларация TextViews (1 показывает, и 4 не делает):

<TextView 
     android:id="@+id/txtvw1" 
     android:layout_centerHorizontal="true" 
     android:layout_width="185dp" 
     android:layout_height="25dp" 
     android:textSize="20sp" 
     android:layout_marginTop="60dp" 
     android:gravity="center" 
     android:inputType="none" 
     android:text="@string/str_StaticA" 
     android:textColor="#C0F700" /> 

    <TextView 
     android:id="@+id/txtvw4" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="35dp" 
     android:layout_width="95dp" 
     android:layout_height="50dp" 
     android:textSize="18dp" 
     android:layout_marginTop="110dp" 
     android:gravity="center" 
     android:inputType="none" 
     android:text="IMHO:" 
     android:textColor="#FFBA19" /> 

Таким образом, в итоге почему выполнение ввода переопределение только дважды, и он просто так случается быть точным два я хочу обновить?

В результате дополнительного чтения и дедуктивного рассуждения выявлено еще несколько фрагментов информации. На мой взгляд, когда-либо View в строке ListView XML проходил бы через ViewBinder, но это было НЕПРАВИЛЬНО! Из того, что я могу понять, вы присоедините ViewBinder к DataAdapter через setViewBinder. Ну, так как DataAdapter рассказывается о том, какой вид (ы) использовать для заполнения данных в нем, имеет смысл, что показываются только два. Я только показывал ему два.

Вот отрывок, где я указую Соображения, участвующие в процессе, населяющего и передать их в конструкторе DataAdapter:

String[] from = new String[] {"txtvw_PrevLift", "txtvw_PrevReps", "ActuLiftPikr", "ActulRepsPikr" }; 
int[] to = {R.id.txtvw_PrevLift, R.id.txtvw_PrevReps, R.id.ActuLiftPikr, R.id.ActulRepsPikr }; 

LiftDataAdapter LiftDataAdapter = new LiftDataAdapter(this, LiftDataMaps, R.layout.liftdatalayout, from, to); 

Хотя это, кажется, имеет смысл, я не знаю, что мое дедуктивное рассуждение является точной. Будет обновляться, когда я нахожу больше информации.

ответ

5

Если вы установите ViewBinder на SimpleAdapterвсеViews вы объявили (в to массиве в вашем случае) не будет передан setViewValue() метода ViewBinder «s ни на что. Если метод setViewValue не возвращает true, что означает, что привязка данных для этого View сбой (по какой-либо причине), то вы получаете действие по умолчанию (для TextView), устанавливая текст из данных Hashmap. Прямо сейчас вы объявили setViewValue, чтобы сделать что-то только для двух TextViews (проверка их идентификаторами), а также для возврата trueнезависимо от того, что. Когда вы введете setViewValue для другого Views в свой макет строки, вы снова войдете в setViewValue, не будете соответствовать идентификаторам (поэтому никаких обновлений для тех Views) и не возвратите true (который скажет адаптеру, что привязка была и этот View не требует больше работы). A look at the source code для метода SimpleAdapter.bindView покажет вам, как используется ViewBinder.

Кроме того, я вижу, что вы используете пользовательский адаптер, вы уверены, что не вмешиваетесь в обычную логику SimpleAdapter?(также не используйте одно и то же имя для имени класса и переменной)

+0

Роджер по именованию класса и переменной одинаковый. Вы правы, и я просто быстро печатал для публикации. Что касается возврата true, я понимаю, что вы говорите, ВСЕГДА возвращает true из setViewValue. Я смотрю ссылку, предоставленную сейчас, чтобы найти лучший способ вернуться из setViewValue, чтобы он был точным, а не только жестко запрограммированным. – GPGVM

+1

Чувак, который является удивительным. Я не знал, что вы можете изучить исходный код. Двойное спасибо. – GPGVM

Смежные вопросы