简体   繁体   English

如何从 RecyclerView 对 CardView 项目进行点击事件

[英]How can I make click event on CardView Item from RecyclerView

I referenced Simple Android RecyclerView example for make click events on items from Recyclerview.我引用了简单的 Android RecyclerView 示例来制作Recyclerview项目上的点击事件。 And then I apply this way to CardView from Recyclerview but I failed.然后我将这种方式应用于 Recyclerview 中的 CardView,但我失败了。

OnClick event on ViewHolder doesn't work. ViewHolder 上的 OnClick 事件不起作用。 It looks like codes are almost same.看起来代码几乎相同。 I don't know what is the problem.我不知道是什么问题。

I just copied codes from the Simple Android RecyclerView example我刚刚从Simple Android RecyclerView 示例中复制了代码

And then changed ArrayList to ArrayList Also, I replace xml which contains textview code with cardview.然后将 ArrayList 更改为 ArrayList 另外,我将包含 textview 代码的 xml 替换为 cardview。

I succeeded the event when I put onClickListener on onBindViewHolder.当我将 onClickListener 放在 onBindViewHolder 上时,我成功了该事件。 But I heard it makes app heavier.但我听说它使应用程序更重。 So I want to avoid this way.所以我想避免这种方式。

MainActivity.java主活动.java

public class MainActivity extends AppCompatActivity implements MyAdapter.ItemClickListener{

    RecyclerView mRecyclerView;
    MyAdapter mAdapter;
    RecyclerView.LayoutManager mLayoutManager;
    ArrayList<MyData> myDataset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        myDataset = new ArrayList<>();
        myDataset.add(new MyData("#InsideOut", R.drawable.a));
        myDataset.add(new MyData("#Mini", R.drawable.b));
        myDataset.add(new MyData("#ToyStroy", R.drawable.c));

        mAdapter = new MyAdapter(this, myDataset);
        mAdapter.setClickListener(this);
        mRecyclerView.setAdapter(mAdapter);
    }
    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + mAdapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }
}

MyAdapter.java我的适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ArrayList<MyData> mDataset;
    private LayoutInflater mInflater;

    private ItemClickListener mClickListener;


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        // each data item is just a string in this case
        public ImageView mImageView;
        public TextView mTextView;
        public CardView cv;

        public ViewHolder(View view) {
            super(view);
            mImageView = (ImageView)view.findViewById(R.id.image);
            mTextView = (TextView)view.findViewById(R.id.textview);
            cv = (CardView)view.findViewById(R.id.cardview);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            Log.d("이거이거", ""+getAdapterPosition());
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(Context context, ArrayList<MyData> myDataset) {
        this.mDataset = myDataset;
        this.mInflater = LayoutInflater.from(context);
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = mInflater.inflate(R.layout.item_cardview, parent, false);
        return new ViewHolder(v);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        Log.d("position", position+"");

        holder.mTextView.setText(mDataset.get(position).text);
        holder.mImageView.setImageResource(mDataset.get(position).img);

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }
    MyData getItem(int id) {
        return mDataset.get(id);
    }

    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

class MyData{
    public String text;
    public int img;
    public MyData(String text, int img){
        this.text = text;
        this.img = img;
    }
}

There is also a way to do this 还有一种方法可以做到这一点

 public ViewHolder(final View view) {
        super(view);
        mImageView = (ImageView)view.findViewById(R.id.image);
        mTextView = (TextView)view.findViewById(R.id.textview);
        cv = (CardView)view.findViewById(R.id.cardview);

        cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mClickListener != null) mClickListener.onItemClick( view,getAdapterPosition());
            }
        });
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    // each data item is just a string in this case
    public ImageView mImageView;
    public TextView mTextView;
    public CardView cv;

    public ViewHolder(View view) {
        super(view);
        mImageView = (ImageView)view.findViewById(R.id.image);
        mTextView = (TextView)view.findViewById(R.id.textview);
        cv = (CardView)view.findViewById(R.id.cardview);

      //for whole cardview (If you want to click only card)
      view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Do the action.
            }
        });

    //if you want to click the only particular item in the CardView
    mImageView .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //Do the action.
            }
        });

    }
}

Try this snippet and let me know. 试试这个片段,让我知道。 I can solve it for you if it doesn't work. 如果无法解决,我可以为您解决。

The problem is your interface is the part of the adapter class while your onclicklistener is part of the holder class . 问题是您的interfaceadapter class的一部分,而您的onclicklistenerholder class一部分。 You need to call the clicklistener from the adapter onBindViewHolder .For that purpose you have to give the id to the root layout of the itemholder layout file , and find view by id in itemholder constructor .After that you can call clicklistener as below. 您需要从适配器onBindViewHolder调用clicklistener ,为此必须将id赋予itemholder layout file的根布局,并在itemholder constructor按id查找视图,然后可以按如下所示调用clicklistener。

 @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        Log.d("position", position+"");

        holder.mTextView.setText(mDataset.get(position).text);
        holder.mImageView.setImageResource(mDataset.get(position).img);
        holder.view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mClickListener.onItemClick(v, position)
        }
    });
    }

Simply add these lines give below in onBindViewHolder you already added this 只需在您已经添加了此内容的onBindViewHolder中添加以下行即可

cv = (CardView)view.findViewById(R.id.cardview); cv =(CardView)view.findViewById(R.id.cardview);

line so it work or make sure you give CardView in xml id that name is cardview 行,以便它起作用或确保您在xml id中给CardView命名为cardview

cv = (CardView)view.findViewById(R.id.cardview);

holder.cv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mClickListener.onItemClick(v, position)
        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在我的 recyclerview 中使用 cardview 设置 onclick 侦听器,并在单击 recyclerview 时从 firebase 数据库中检索数据? - How can I set onclick listener in my recyclerview with cardview and retreive the data from firebase database when i click the recyclerview? Android:如何使用“保存”按钮在一个活动中单击以在Recyclerview活动中添加CardView项目? - Android: how do I use Save button click in one Activity to add a CardView item in Recyclerview Activity? 如何访问 recyclerview 中的所有 cardviews,点击特定 cardview 的项目 - How to access all cardviews in a recyclerview, on item click of a particular cardview 如何在recyclelerview中点击当前项目的按钮时,如何显示上一个项目的按钮? - How can I make previous item's button visible when click on current item's button in recyclerview? 如何在 cardview 中为 recyclerview 对齐 textview - How can I align the textview in cardview for recyclerview 如何将 RecyclerView 和 CardView 实现到片段中? - How can I implement a RecyclerView and a CardView into a fragment? 我如何扩展cardview并将其作为Recyclerview中的唯一项传递? - How do i extend cardview and pass it as the only item inside Recyclerview? 如何将CardView展开以重叠下一个RecyclerView项目? - How do I expand a CardView to overlap next RecyclerView Item? Android:使用RecyclerView和CardView进行商品复制-如何停止复制? - Android: Item Duplication with RecyclerView & CardView - How do I stop the duplication? 如何处理Recyclerview列表项单击事件 - How to handle Recyclerview list item click event
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM