Я ссылался на Простой пример Android RecyclerView для создания событий щелчка по элементам из Recyclerview. И затем я применяю этот способ к CardView из Recyclerview, но у меня не получилось.
Событие OnClick в ViewHolder не работает. Похоже, что коды почти одинаковы. Я не знаю, в чем проблема.
Я просто скопировал коды из Простой пример Android RecyclerView
А затем изменил ArrayList на ArrayList Кроме того, я заменяю xml, который содержит код textview, на cardview.
Я преуспел в этом событии, когда поставил onClickListener на onBindViewHolder. Но я слышал, что это утяжеляет приложение. Поэтому я хочу избежать этого пути.
MainActivity.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;
}
}
@g.brahma Datta эм... если не возражаете, я в любом случае хочу знать. а оригинал это весь кардвью
Конечно. Проверьте мой ответ ниже @snail.
Есть также способ сделать это
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. Вам нужно вызвать clicklistener из адаптера onBindViewHolder. Для этого вы должны передать id корневому макету itemholder layout file и найти представление по id в itemholder constructor. После этого вы можете вызвать 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)
}
});
}
OnclickListener в onBindViewHolder — плохая практика @Raza.
Вы хотите включить действие при щелчке по всему карточному представлению или любому конкретному представлению внутри карточного представления? @улитка