仅适用于 Android 7 和 8 - ClassCastException:无法将 LayoutParams 转换为 AbsListView$LayoutParams

2024-04-18

我正在研究一个非常奇怪的问题。我没有编写原始代码,但我正在调查为什么它现在突然崩溃。看完之后,我没有发现任何崩溃的原因。此外,它可以在较低的操作系统级别(例如 Android 6)中完美运行;然而,在 Android 7 和 8 中运行时,它始终崩溃。一开始也很难重现,因为崩溃仅在第 6 个索引之后才会显现......最初认为这可能是一些损坏的数据,因为问题只是针对某些用户表现出来。但一旦我增加了列表中的项目数量,我就能够一致地重现。当我们迭代药物对象列表并构造它们的列表以供用户快速引用时,列表适配器中会发生类转换异常。索引 0 到 5 没有问题;然而,在处理完索引6之后,应用程序在返回View(最初传入的convertView)时崩溃。我已经使用多达 6 种药物逐步执行了代码,但从未发现任何问题。在逐步执行第 6 个索引(第 7 个药物)后,当 getView(...) 方法返回时,它会始终崩溃。正如我之前所说,只有当代码在 Android 7 和 8 中运行时才会发生这种情况。当代码在 Android 6 上运行时(例如),它可以处理 10 多种药物甚至更多。甚至对拥有 20 个用户的用户进行了测试。想知道是否有人遇到过此问题和/或有建议/想法。 Android 7 和 8 中适配器的视图回收器是否可能发生某些变化?仅当药物列表大于屏幕可显示时才会发生这种情况,这是没有意义的。就好像回收器在 Android 7 和 8 中存在错误一样......

这是 getView(...) 的实现:

public View getView(int position, View convertView, ViewGroup parent) {

    Log.i(TAG, position + " | " + convertView);

    ViewHolder holder;

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    // MedicationItem
    MedicationItem medItem_pos = rowItems.get(position);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.med_adjustment_reconciliation_item, parent, false);
        holder = new ViewHolder();
        holder.drugInfo = (TextView) convertView.findViewById(R.id.med_adj_recon_list_item_drug_info_textview);
        holder.drugDosageInfo = (TextView) convertView.findViewById(R.id.med_adj_recon_list_item_drug_dosage_info_textview);

        if (medItem_pos.isTaking()) {
            ((ListView)parent).setItemChecked(position, true);

        } else {
            ((ListView)parent).setItemChecked(position, false);
        }

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    // Build Drug Info
    StringBuilder sbDrugInfo = new StringBuilder(medItem_pos.getDrug());
    if (StringUtils.isNotEmpty(medItem_pos.getTradeName()))
        sbDrugInfo.append(String.format(" (%s) ", Html.fromHtml(medItem_pos.getTradeName())));
    if (null != medItem_pos.getDose() && medItem_pos.getDose() > 0 && StringUtils.isNotEmpty(medItem_pos.getMedUnit())) {
        MedUnit medUnit = EnumUtils.lookup(MedUnit.class, medItem_pos.getMedUnit());
        sbDrugInfo.append(String.format("%s %s", medItem_pos.getDose(), (null==medUnit?medItem_pos.getMedUnit():medUnit.getLocaleString())));
    }

    // Build Drug Dosage Info
    StringBuilder sbDrugDosageInfo = new StringBuilder();
    sbDrugDosageInfo.append(defineQuantity(medItem_pos.getQuantity(), medItem_pos.getDosageFormUnit()));

    if (StringUtils.isNotBlank(medItem_pos.getFrequency())){
        MedFrequency medFrequency = EnumUtils.lookup(MedFrequency.class, medItem_pos.getFrequency());
        if (null != medFrequency){
            if (sbDrugDosageInfo.length() > 0)
                sbDrugDosageInfo.append(" | ").append(medFrequency.getLocaleString());
            else
                sbDrugDosageInfo.append(medFrequency.getLocaleString());
        }else{
            sbDrugDosageInfo.append(MedFrequency.OTHER.getLocaleString());
        }
    }

    // display drug information
    holder.drugInfo.setText(sbDrugInfo.toString());
    holder.drugDosageInfo.setText(sbDrugDosageInfo.toString());

    return convertView;
}

...
...

private class ViewHolder {
    TextView drugInfo;
    TextView drugDosageInfo;
}

这是错误:

02-20 21:22:11.923 909-7727/? I/ActivityManager: START u0 {cmp=com.some.co/.modules.medadjustment.MedAdjustmentActivity (has extras)} from uid 10246
02-20 21:22:11.926 689-689/? D/QCOM PowerHAL: LAUNCH HINT: ON
02-20 21:22:11.928 689-689/? D/QCOM PowerHAL: Activity launch hint handled
02-20 21:22:11.936 675-2136/? D/audio_hw_primary: out_write: retry previous failed cal level set
02-20 21:22:11.951 21906-21911/? I/zygote: Do partial code cache collection, code=126KB, data=89KB
02-20 21:22:11.952 21906-21911/? I/zygote: After code cache collection, code=124KB, data=88KB
02-20 21:22:11.952 21906-21911/? I/zygote: Increasing code cache capacity to 512KB
02-20 21:22:12.074 21906-21906/? D/AndroidRuntime: Shutting down VM
02-20 21:22:12.074 21906-21906/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.some.co, PID: 21906
    java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.removeUnusedFixedViews(ListView.java:1990)
        at android.widget.ListView.layoutChildren(ListView.java:1851)
        at android.widget.AbsListView.onLayout(AbsListView.java:2164)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(Unknown Source:68)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:761)
        at android.view.View.layout(View.java:19659)
        at android.view.ViewGroup.layout(ViewGroup.java:6075)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2496)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2212)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
02-20 21:22:12.078 21906-21906/? I/zygote: System.exit called, status: 2
02-20 21:22:12.078 21906-21906/? I/AndroidRuntime: VM exiting with result code 2, cleanup skipped.
02-20 21:22:12.097 909-1399/? W/InputDispatcher: channel '643fc74 com.some.co/com.some.co.modules.welcome.MyActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
02-20 21:22:12.097 909-1399/? E/InputDispatcher: channel '643fc74 com.some.co/com.some.co.modules.welcome.MyActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
02-20 21:22:12.098 909-949/? W/zygote64: kill(-21906, 9) failed: No such process
02-20 21:22:12.098 909-1664/? I/ActivityManager: Process com.some.co (pid 21906) has died: fore TOP 

最后,这是布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/med_adj_recon_list_item_background_frame"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/button_white_with_gray_border"
    android:layout_margin="@dimen/spacing_tiny">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="@dimen/spacing_small"
        android:layout_gravity="center_vertical"
        android:layout_margin="@dimen/spacing_small">
        <TextView
            android:id="@+id/med_adj_recon_list_item_drug_info_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/font_normal"
            android:textColor="@drawable/button_custom_med_adjustment_text_color"/>
        <TextView
            android:id="@+id/med_adj_recon_list_item_drug_dosage_info_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/font_small"
            android:textColor="@drawable/button_custom_med_adjustment_text_color"/>
    </LinearLayout>
    <View
        android:id="@+id/med_adj_recon_list_item_divider"
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:background="@drawable/color_selector"/>
    <ImageView
        android:id="@+id/med_adj_recon_list_item_image_view"
        android:layout_width="@dimen/icon_width"
        android:layout_height="@dimen/icon_height"
        style="@style/IconImageViewBase"
        android:src="@drawable/tick_selector"/>
</LinearLayout>

有时另一双眼睛会有所帮助。非常感谢您的帮助!

以下是加载 ListView 的片段类的导入:

import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.some.co.R;
import com.some.co.fragment.CommonFragment;
import com.some.co.modules.home.cards.CardFragment;
import com.some.co.modules.medadjustment.model.DeclineMedicationReason;
import com.some.co.modules.medadjustment.model.MedicationItem;
import com.some.co.modules.medadjustment.model.TextDrawable;

import java.lang.reflect.Type;
import java.util.List;

以下是 build.gradle 中的依赖项:

final ANDROID_SDK_VERSION = '22.2.1'

dependencies {
    compile "com.android.support:design:$ANDROID_SDK_VERSION"
    compile "com.android.support:appcompat-v7:$ANDROID_SDK_VERSION"
    compile "com.android.support:support-v4:$ANDROID_SDK_VERSION"
    compile "com.android.support:cardview-v7:$ANDROID_SDK_VERSION"
    compile "com.android.support:recyclerview-v7:$ANDROID_SDK_VERSION"
    compile 'com.android.support:multidex:1.0.1'
    // only include the needed dependencies from play-services, 8.4 version above require SDK23.
    compile 'com.google.android.gms:play-services-auth:8.3.0'
    compile 'com.google.android.gms:play-services-base:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'
    compile 'com.google.android.gms:play-services-analytics:8.3.0'
    compile 'com.google.android.gms:play-services-location:8.3.0'
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'org.greenrobot:greendao-encryption:2.2.2'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'joda-time:joda-time:2.8.2'
    compile 'org.joda:joda-convert:1.4' // for proguard, b/c we're using joda-time (above)
    // for UI testing
    androidTestCompile 'com.jayway.android.robotium:robotium-solo:4.3.1'
    androidTestCompile 'com.squareup.spoon:spoon-client:1.7.0'
}

此外,“compileSdkVersion”和“targetSdkVersion”均设置为 22


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅适用于 Android 7 和 8 - ClassCastException:无法将 LayoutParams 转换为 AbsListView$LayoutParams 的相关文章

随机推荐