android - 线性布局无法转换为 RecyclerView onClickItemListener

标签 android android-recyclerview onclicklistener

我正在尝试实现一个 onClickListener 以允许用户点击他们 friend 的 RecyclerView 列表。但是,在单击用户列表项时,它只会返回错误:

01-18 20:39:37.317 3413-3413/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.feastappv2, PID: 3413
    java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams
        at android.support.v7.widget.RecyclerView.getChildViewHolderInt(RecyclerView.java:3411)
        at android.support.v7.widget.RecyclerView.getChildLayoutPosition(RecyclerView.java:3445)
        at com.example.android.feastappv2.feastapp.Friends.FriendFragment$ContactViewHolder.onClick(FriendFragment.java:73)
        at android.view.View.performClick(View.java:5254)
        at android.view.View$PerformClick.run(View.java:21173)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:6840)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

问题行在:

@Override
public void onClick(View view) {
    int itemPosition = mRecyclerView.getChildLayoutPosition(view);
    Toast.makeText(getContext(),
            "Position is: " + String.valueOf(itemPosition),
            Toast.LENGTH_LONG).show();
}

在我的类里面:

public class FriendFragment extends Fragment {

    RecyclerView mRecyclerView;
    ArrayList<Friend> mContacts;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.recycler_layout, container, false);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_layout);
        mRecyclerView.setHasFixedSize(true);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        mContacts = FriendProvider.getInstance(getActivity()).getFriends();
        mRecyclerView.setAdapter(new ContactAdapter(mContacts));

        return view;
    }

    // Inner Class

    private class ContactViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private final TextView mName;
        private final TextView mNumber;
        private Friend mContact;

        public ContactViewHolder(View itemView) {
            super(itemView);

            mName = (TextView) itemView.findViewById(R.id.tv_name);
            mNumber = (TextView) itemView.findViewById(R.id.tv_number);

            mName.setOnClickListener(this);
        }

        public void bindContact(Friend contact){
            mContact = contact;
            mName.setText(contact.getFirstName().toString() + " " + contact.getLastName());
            mNumber.setText(contact.getFriendChannelID().toString());
        }

        @Override
        public void onClick(View view) {
            int itemPosition = mRecyclerView.getChildLayoutPosition(view);
            Toast.makeText(getContext(), "Position is: " + String.valueOf(itemPosition), Toast.LENGTH_LONG).show();
        }

    }

    class ContactAdapter extends RecyclerView.Adapter<ContactViewHolder> {
        ArrayList<Friend> contactList;

        ContactAdapter(ArrayList<Friend> object){
            this.contactList = object;
        }

        @Override
        public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.rv_item, parent, false);

            return new ContactViewHolder(view);
        }

        @Override
        public void onBindViewHolder(ContactViewHolder holder, int position) {
            Friend contact = contactList.get(position);
            holder.bindContact(contact);
        }

        @Override
        public int getItemCount() {
            return contactList.size();
        }
    }
}

最佳答案

如果想获取被点击的item的位置,可以使用adapter的位置获取

int itemPosition = getAdapterPosition();

在您的 OnClick 方法中

关于android - 线性布局无法转换为 RecyclerView onClickItemListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34867172/

相关文章:

android - 在 Activity 中获取 Fragment 实例

java - Android POST 请求 400 响应代码抛出异常

android - 什么都复制到项目中?

android - notifyDataSetChanged() recyclerview,只有第一个单元格点击更改

c# - 在 Recyclerview 中更改所选项目的背景颜色

android - 将支持库从 "23.1.1"升级到 "23.2.1"后,回收站 View 项填满整个回收站 View 高度

android - 如何从以编程方式添加的按钮中获取 OnClick()?

android - Accessibility Dialog/DialogFragment 读取文本而不是内容描述

android - 使用 Android 中的共享首选项保存位置

android - 如何将参数传递给 OnClickListener?