【问题标题】:How to set Tag TextView in View Holder desgin pattern?如何在 View Holder 设计模式中设置 Tag TextView?
【发布时间】:2015-03-05 06:58:32
【问题描述】:

我有一个 Spinner,它为其项目使用自定义基础适配器...

在基本适配器中,我使用具有 TexTView 的视图支架设计模式..

现在当我在 getView 中膨胀 TextView 并设置标签时,app 会抛出 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)

谢谢。

【问题讨论】:

  • 你能提供我在 SpinnerCatsAdapter.java 的第 65 行的声明

标签: android


【解决方案1】:

试试这个

@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;
    }    

【讨论】:

  • 您还有其他解决方案吗?
  • 你能粘贴你的viewholder类吗?
【解决方案2】:

基本上,您可以将任何类型的对象存储为标记(并在调用 getTag 时将其转换回)。这可以是一个简单的 ID,也可以是一些复杂的数据。这是您与此视图相关联的一些信息。

在列表和视图持有者模式的情况下,它是一个简单的对象,其中包含对标记视图(组)的视图的引用。因此,您不必在每次更新视图内容时都调用 findViewById。这只是性能优化。

我们可以在视图标签中存储列表项的数据吗? 不。由于视图回收,您有(例如)10 个视图,这些视图被重复用于 1000 个列表项。在标签中存储数据在这里毫无意义。最好使用自定义数据对象来存储列表项状态(可能与包含显示数据的数组相同),或者在列表项更改时立即将其持久化。

另见setTag documentation.

【讨论】:

    【解决方案3】:

    您没有发布您的布局,但假设 TextView spinner_txt 是 spinner_txt 布局中的唯一元素,此代码

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

    使textView_title 与View 与convertView 相同,并且

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

    用字符串覆盖convertView 中的viewholder 标签。

    考虑将cat_ids[position] 存储在视图持有者中而不是作为标签,或者使用setTag(int, Object) 按键设置另一个标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多