![](/img/trans.png)
[英]How can I set onclick listener in my recyclerview with cardview and retreive the data from firebase database when i click the recyclerview?
[英]How can I make click event on CardView Item from RecyclerView
我引用了简单的 Android RecyclerView 示例来制作Recyclerview项目上的点击事件。 然后我将这种方式应用于 Recyclerview 中的 CardView,但我失败了。
ViewHolder 上的 OnClick 事件不起作用。 看起来代码几乎相同。 我不知道是什么问题。
我刚刚从Simple Android RecyclerView 示例中复制了代码
然后将 ArrayList 更改为 ArrayList 另外,我将包含 textview 代码的 xml 替换为 cardview。
当我将 onClickListener 放在 onBindViewHolder 上时,我成功了该事件。 但我听说它使应用程序更重。 所以我想避免这种方式。
主活动.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();
}
}
我的适配器
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;
}
}
还有一种方法可以做到这一点
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.
}
});
}
}
试试这个片段,让我知道。 如果无法解决,我可以为您解决。
问题是您的interface
是adapter class
的一部分,而您的onclicklistener
是holder class
一部分。 您需要从适配器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)
}
});
}
只需在您已经添加了此内容的onBindViewHolder中添加以下行即可
cv =(CardView)view.findViewById(R.id.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.