2015-01-07 2 views
0

я есть Spinner Тад использовать персонализированный базовый адаптер для его элементов ...Как установить тег TextView в виде шаблона владельца Desgin?

в базовом адаптере я использовать вид держателя шаблона дизайна, который имеет TextView ..

теперь, когда в GetView я inflat TextView и установить тег, приложение выбрасывает ClassCastException ....

мой код:

Мой заказ Базовый адаптер:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View convertView = view; 
    ViewHolder viewHolder ; 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.spinner_txt, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.textView_title = (TextView) convertView.findViewById(R.id.spinner_txt); 
     convertView.setTag(viewHolder); 
    } 
    else 
    { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.textView_title.setTag(cat_ids[position]); 
    viewHolder.textView_title.setText(cat_names[position]); 
    viewHolder.textView_title.setTypeface(genericTasks.getCustomFont(this.activity, this.activity.getResources().getString(R.string.font1_name))); 
    viewHolder.textView_title.setOnTouchListener(this); 

    return convertView; 
} 

мой макет:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/spinner_txt" 
      style="?android:attr/spinnerItemStyle" 
      android:singleLine="true" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:ellipsize="marquee" 
      android:textSize="@dimen/xlarge_font_size" 
      android:textColor="@color/app_black_color" 
      android:paddingLeft="@dimen/horizontal_padding_size" 
      android:paddingRight="@dimen/horizontal_padding_size" 
      android:paddingTop="@dimen/vertical_padding_size" 
      android:paddingBottom="@dimen/vertical_padding_size" 
      android:layout_centerVertical="true"/> 

и исключение:

java.lang.ClassCastException: java.lang.String cannot be cast to co.mobinone.hamamoz.adapters.SpinnerCatsAdapter$ViewHolder 
      at co.mobinone.hamamoz.adapters.SpinnerCatsAdapter.getView(SpinnerCatsAdapter.java:65) 
      at android.widget.Spinner.measureContentWidth(Spinner.java:772) 
      at android.widget.Spinner.onMeasure(Spinner.java:506) 
      at android.view.View.measure(View.java:17509) 
      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
      at android.view.View.measure(View.java:17509) 
      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
      at android.view.View.measure(View.java:17509) 
      at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1781) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.widget.ScrollView.onMeasure(ScrollView.java:477) 
      at android.view.View.measure(View.java:17509) 
      at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:704) 
      at android.view.View.measure(View.java:17509) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:17509) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380) 
      at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:412) 
      at android.view.View.measure(View.java:17509) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2567) 
      at android.view.View.measure(View.java:17509) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2287) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1398) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1597) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1256) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6649) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:613) 
      at android.view.Choreographer.doFrame(Choreographer.java:583) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5653) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
      at dalvik.system.NativeStart.main(Native Method) 

спасибо.

+0

Вы можете предоставить мне заявление по строке 65 от SpinnerCatsAdapter.java – SAM

ответ

0

Попробуйте

@Override 
    public View getView(int position, View view, ViewGroup parent) { 
     View convertView = view; 
     ViewHolder viewHolder ; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.spinner_txt, null); 
      viewHolder = new ViewHolder(); 
      Textview text = (TextView) convertView.findViewById(R.id.spinner_txt); 
      viewHolder.textView_title = text; 
      convertView.setTag(viewHolder); 
     } 
     else 
     { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.textView_title.setTag(cat_ids[position]); 
     viewHolder.textView_title.setText(cat_names[position]); 
     viewHolder.textView_title.setTypeface(genericTasks.getCustomFont(this.activity, this.activity.getResources().getString(R.string.font1_name))); 
     viewHolder.textView_title.setOnTouchListener(this); 

     return convertView; 
    }  
+0

благодарите цепочку за ответ –

+0

, пожалуйста. мой код работал или нет? – chain

+0

ваш код не работает –

0

В принципе вы можете хранить любой тип объекта в качестве тега (и брось его обратно при вызове GetTag). Это может быть простой идентификатор или некоторые сложные данные. Это некоторая информация, которую вы связываете с этим представлением.

В случае списков и шаблона держателя вида это простой объект, который содержит ссылки на представления помеченного представления (группы). Поэтому вам не нужно вызывать findViewById каждый раз, когда вы обновляете содержимое представления. Это просто оптимизация производительности.

Можно ли сохранить данные элемента списка в теге просмотра? Нет. Из-за перераспределения просмотров у вас есть (например) 10 видов, которые повторно используются для 1000 элементов списка. Хранение данных в теге не имеет смысла. Лучше использовать пользовательский объект данных для хранения состояния элемента списка (возможно, того же массива, который содержит отображаемые данные), или вы сохраняете его сразу же при изменении элемента списка.

Смотрите также setTag documentation.

0

Вы не отправлял макет, но предполагая, что TextViewspinner_txt является единственным элементом в spinner_txt макете, этот код

viewHolder.textView_title = (TextView) convertView.findViewById(R.id.spinner_txt); 

делает textView_title быть таким же, как ViewconvertView и

viewHolder.textView_title.setTag(cat_ids[position]); 

перезаписывает тег viewholder в convertView со строкой.

Рассмотрите возможность хранения cat_ids[position] в держателе изображения, а не в качестве тега, или используйте setTag(int, Object), чтобы установить другой тег по ключу.