gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:41 29 4
gpt4 key购买 nike

我使用 android RecycleView 来替换 ListLiew。

我想做的是在我的列表项中的一个 ImageView 上启用 onClick(想象这个列表项有一个图像和一个文本,我想向图像添加一个 onClick 监听器而不是列表项本身)

我使用以下布局 xml 创建一个 RecycleView 适配器:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_height="48dp"
android:background="@drawable/border_bottom">

<ImageView
android:id="@+id/icon"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/ic_action_play_dark"
android:layout_centerVertical="true" />

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="56dp"
android:text="Search"
android:textColor="#333"
android:textStyle="bold"
android:layout_centerVertical="true"
android:gravity="center_vertical"/>

</RelativeLayout>

和我的 onCreateViewHolder

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_list_item, parent, false);

ImageView icon = (ImageView)v.findViewById(R.id.icon);
icon.setOnClickListener(listener);

PropertyViewHolder vh = new PropertyViewHolder(v);

return vh;
}

我想将监听器绑定(bind)到 ImageView 图标(View 的子级),而不是 View 本身,但是,它总是抛出异常:

12-23 17:37:36.033: E/AndroidRuntime(5806): java.lang.ClassCastException:
android.widget.RelativeLayout$LayoutParams cannot be cast to
android.support.v7.widget.RecyclerView$LayoutParams
at android.support.v7.widget.RecyclerView.getChildPosition(RecyclerView.java:2589)
.....

当我点击图片时,我的onclickListner在这里

@Override
public void onClick(View v) {

int itemPosition = getRecycleView().getChildPosition(v);

Toast.makeText(getActivity(), "click ", Toast.LENGTH_SHORT).show();
}

有什么想法吗?

最佳答案

从评论中,您可能已经知道它不起作用,因为您的 ImageView 不是驻留在 RecyclerView 中的 View 。

在这种情况下,我建议您在 ViewHolder 中实现监听器,然后在单击图标时传递 ViewHolder 引用而不是 View

我将在下面提供一个示例,


示例 RecyclerView

请注意我是如何在 MyRecyclerViewAdapterMyViewHolder 的构造函数中分配监听器的,它来自 Activity fragment **。 ActivityFragment 将实现 MyViewHolderListener 接口(interface),该接口(interface)将提供 onIconClicked 方法。

现在请注意,我在 onIconClicked 方法中提供了 MyViewHolder.this 引用。使用该 ViewHolder 对象,您可以获得适配器位置,然后最终获得实际的 Data 对象。我也提供了 onIconClicked 方法的实现。

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<Object> mData;

private MyViewHolder.MyViewHolderListener mViewHolderListener;

public MyRecyclerViewAdapter(MyViewHolder.MyViewHolderListener listener) {
mData = new ArrayList<>();
mViewHolderListener = listener;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new MyViewHolder(view, mViewHolderListener);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
((MyViewHolder) viewHolder).update(mData.get(position));
}

public void setData(@NonNull List<Object> newData) {
mData.addAll(newData);
notifyDataSetChanged();
}

public Object getItemAtPosition(int position) {
try {
return mData.get(position);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
return null;
}
}

@Override
public int getItemCount() {
return mData == null ? 0 : mData.size();
}

public void reset() {
mData.clear();
notifyDataSetChanged();
}

public static final class MyViewHolder extends RecyclerView.ViewHolder {

ImageView icon;

public MyViewHolder(View itemView, final MyViewHolderListener listener) {
super(itemView);
icon = (ImageView) itemView.findViewById(R.id.icon);
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onIconClicked(MyViewHolder.this);
}
});
}

public void update(Object myObject) {
// update icon
}

public interface MyViewHolderListener {
void onIconClicked(MyViewHolder clickedViewHolder);
}
}


ActivityFragment 中实现 OnIconClicked

@Override
public void onIconClicked(MyRecyclerViewAdapter.MyViewHolder clickedViewHolder) {
int adapterPosition = clickedViewHolder.getAdapterPosition();
if(adapterPosition != RecyclerView.NO_POSITION) {
Object selectedItem = mAdapter.getItemAtPosition(adapterPosition);
}
}

我希望这能解决您的问题!

关于java.lang.ClassCastException : android. widget.RelativeLayout$LayoutParams 无法转换为 android.support.v7.widget.RecyclerView$LayoutParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617693/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com