2013-08-22 2 views
2

После просмотра here я пытаюсь реализовать собственный эффективный адаптер,Эффективный адаптер имеет java.lang.ClassCastException?

Мой ViewHolder класс почти то же самое:

static class ViewHolder { 
     ImageButton button; 
     TextView txtView; 
    } 

GetView метод выглядит следующим образом:

private void getView(...) { 

    if(convertView == null) { 
     convertView = LayoutInflater.from(
       parent.getContext()).inflate(R.layout.linear_container, 
         parent, false); 

     holder = new ViewHolder(); 
     convertView.setTag(holder); 
    } else { 
     // erro line 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    LinearLayout llCustomImgViewContainer = (LinearLayout) convertView 
      .findViewById(R.id.llContainer); 
    llCustomImgViewContainer.setTag(viewPosition); 

    return converView; 
} 

но вот однажды новый вид начал ничья, дайте мне ошибку

D/AndroidRuntime (748): выключение VM W/dalvikvm (748): threadid = 1: поток, выходящий с неперехваченным исключением (group = 0x412a4300) E/AndroidRuntime (748): FATAL EXCEPTION: main E/AndroidRuntime (748): java.lang.ClassCastException: java .lang.Integer не может быть добавлен в com.droid.test.widget.customListView $ CustomBaseAdapter $ ViewHolder

У любого есть идея, что здесь не так?

+0

извини [ссылка] (http://www.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html) больше не существует: - /. – CoDe

ответ

6

Кажется, что сначала с

convertView.setTag(holder); 

линии вы настраиваете тег (который является держателем), связанный с этой точкой зрения, но позже с

llCustomImgViewContainer.setTag(viewPosition); 

вы устанавливаете viewPosition в качестве тега. Тогда, вероятно, в

holder = (ViewHolder) convertView.getTag(); 

ваш код пытается бросить Integer к ViewHolder и бросает java.lang.ClassCastException.

Если я не ошибаюсь, и это структура "linear_container" макете

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/llContainer"> 

    <!-- some views --> 

</LinearLayout> 

Вид вернулся из

LayoutInflater.from(parent.getContext()).inflate(R.layout.linear_container,parent,false); 

и вид вернулся из

convertView.findViewById(R.id.llContainer); 

должен быть таким же.

+0

да для выше обоих ответ ... convertView и llCustomImgViewContainer оба представляют собой два разных вида ... так что оба должны быть независимыми. – CoDe

+0

Я обновил свой ответ. Если бы я догадался, это может объяснить, почему эти взгляды зависят. – hcelaloner

+0

ahhha ... получил идею ... как я пропустил это. хорошо описание спасибо. – CoDe

0

Вы установив Int вместо просмотра:

llCustomImgViewContainer.setTag(viewPosition); 

При использовании SetTag, вы сохраните данный объект (viewPosition) в вызывающий объект (llCustomImgViewContainer).

Удалите последнюю строку:

llCustomImgViewContainer.setTag(viewPosition); 
Смежные вопросы