ClassCastException: android.widget.RelativeLayout$LayoutParams 无法转换为 android.support.v7.widget.RecyclerView$LayoutParams inside activity

ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams inside activity

我正在尝试单击在适配器视图中声明的按钮 我正在加载 recyclerview activity 当我执行单击并尝试从 mRecyclerView.getChildLayoutPosition 方法获取值时,它给我 classcastexception

这是我的代码 activity

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location_reminder_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        dbAdapter=new LocationReminderDBAdapter(getApplicationContext());
        dbAdapter.open();
        /////////////////////////////////////////////////////////////////////////////////////
        mRecyclerView = (RecyclerView)findViewById(R.id.reminders_recycler);

        int[] locationImage = new int[5];
        for (int i = 0; i < locationImage.length; i++) {
            locationImage[i] = i;
        }
        reminderNames = new ArrayList<String>();
        reminderLocations = new ArrayList<String>();
        imagePaths=new ArrayList<String>();
        mLayoutManager = new LinearLayoutManager(getApplicationContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        adapter = new SavedReminderAdapter(reminderNames, reminderLocations, imagePaths);
        mRecyclerView.setAdapter(adapter);
        populateReminderList();

        adapter.setListener(new SavedReminderAdapter.Listener() {
            @Override
            public void onClick(int position) {
                Intent intent=new Intent(getApplicationContext(),ViewAddedReminder.class);
                startActivity(intent);
            }


        });
        //////////////////////////////////////////////////////////////////////////////////////
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(LocationReminderList.this,AddLocationReminder.class);
                startActivity(intent);
               /* Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();*/
            }
        });


    }

这里报错classcastexception

public void editReminder(View view){
        int itemPosition = mRecyclerView.getChildLayoutPosition(view);

    }

这是我的 activity

布局代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/content_location_reminder_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="2dp"
    android:paddingLeft="0.5dp"
    android:paddingRight="0.5dp"
    android:paddingTop="2dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="reminder.locrem.com.locationreminder.LocationReminderList"
    tools:showIn="@layout/app_bar_location_reminder_list">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="118dp"
        android:layout_marginTop="87dp"
        android:id="@+id/tempshow" />

    <include
        layout="@layout/recycler_view_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


</RelativeLayout>

这是我的回收视图布局代码(recycler_view_list)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/reminders_recycler"
    android:scrollbars="vertical">

</android.support.v7.widget.RecyclerView>

最后是我的适配器视图布局代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/reminder_card_view"
    android:layout_margin="5dp"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:cardCornerRadius="4dp"
    card_view:cardElevation="4dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textSize="18sp"
            android:textAlignment="viewStart"
            android:id="@+id/list_of_items_label"
            android:textStyle="normal|bold"
            android:text="Items List" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textSize="14sp"
            android:textAlignment="viewStart"
            android:id="@+id/list_of_items"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textSize="18sp"
            android:textAlignment="viewStart"
            android:id="@+id/location_label"
            android:textStyle="normal|bold"
            android:text="Location" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:textSize="14sp"
            android:maxLines="1"
            android:ellipsize="end"
            android:textAlignment="viewStart"
            android:id="@+id/location_value"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:id="@+id/info_image"
            android:layout_weight="0.47"
            android:scaleType="centerCrop"
            />
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="32dp">
        <ImageButton
            android:id="@+id/reminder_alarm"
            android:background="@android:drawable/ic_lock_idle_alarm"
            android:layout_width="31dp"
            android:layout_height="31dp"
            android:onClick="setAlarm"/>
        <ImageButton
            android:layout_width="31dp"
            android:layout_height="31dp"
            android:id="@+id/markCompleted"
            android:layout_centerHorizontal="true"
            android:background="@drawable/done"
            android:backgroundTint="@color/common_google_signin_btn_text_light_default"
            android:onClick="settaskCompleted"/>
        <ImageButton
            android:id="@+id/edit_reminder"
            android:layout_alignParentRight="true"
            android:background="@android:drawable/ic_menu_edit"
            android:layout_width="31dp"
            android:layout_height="31dp"
            android:onClick="editReminder"/>
        </RelativeLayout>

    </LinearLayout>
</android.support.v7.widget.CardView>

build.gradle 文件

compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services-maps:9.2.0'
    compile 'com.google.android.gms:play-services:9.2.0'
    compile 'com.google.android.gms:play-services-ads:9.2.0'
    compile 'com.google.android.gms:play-services-auth:9.2.0'
    compile 'com.google.android.gms:play-services-gcm:9.2.0'
    compile 'com.android.support:cardview-v7:24.2.1'

请帮我解决这个问题 提前致谢

您使用的是哪个版本的支持库?支持库 v24.2.0 或更早版本中存在导致此问题的已知错误。尝试更新到较新的版本,看看是否有帮助。版本 24.2.1 对我有用。

问题实际上出在您所指的同一方法中

public void editReminder(View view){
        int itemPosition = mRecyclerView.getChildLayoutPosition(view);
}

getChildLayoutPosition 内部调用下面的方法

static ViewHolder getChildViewHolderInt(View child) {
        if (child == null) {
            return null;
        }
        return ((LayoutParams) child.getLayoutParams()).mViewHolder;
}

正如你在上面看到的,它试图将 LayoutParams 转换为 RecyclerView.LayoutParams 而你的视图 class 是 RelativeLayout 从而抛出 class 转换异常这里。

下面说说解决方法

我宁愿向您推荐一种通过在标签中设置来获取视图 ID 的简单方法。

onBindViewHolder设置id

@Override
public void onBindViewHolder(ViewHolder customViewHolder, int i) {
   // do your stuff
   viewHolder.itemView.setTag(<SET_YOUR_ID>);
}

并取回它

public void editReminder(View view){
    int itemPosition = (int)view.getTag();
}