Hivatkoztam az Egyszerű Android RecyclerView-példára a Recyclerview elemeire vonatkozó kattintási eseményekhez. Aztán ezt a módszert alkalmaztam a CardView-re a Recyclerview-ból, de nem sikerült.
Az OnClick esemény a ViewHolderen nem működik. Úgy tűnik, a kódok szinte azonosak. Nem tudom mi a probléma.
Most másoltam ki a kódokat az Simple Android RecyclerView példából
Ezután az ArrayList-et ArrayList-re változtattam. Ezenkívül a textview kódot tartalmazó xml-t kártyanézetre cserélem.
Sikerült az esemény, amikor az onClickListenert az onBindViewHolderre tettem. De azt hallottam, hogy nehezebbé teszi az alkalmazást. Szóval ezt az utat szeretném elkerülni.
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;
}
}