Czy ktoś używający RecyclerView
znalazł sposób na ustawienie onClickListener
dla elementów w RecyclerView
?
Pomyślałem o ustawieniu listenera na każdy z układów dla każdego elementu, ale to wydaje się trochę zbyt kłopotliwe.
Jestem pewien, że istnieje sposób na to, aby RecyclerView
nasłuchiwał zdarzenia onClick
, ale nie mogę tego do końca rozgryźć.
Ponieważ API's radykalnie się zmieniło, nie zdziwiłbym się, gdybyś musiał stworzyć OnClickListener
dla każdego elementu. Nie jest to jednak aż tak bardzo kłopotliwe. W swojej implementacji RecyclerView.Adapter<MyViewHolder>
, powinieneś mieć:
private final OnClickListener mOnClickListener = new MyOnClickListener();
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}
Metoda onClick
:
@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
Sprawdź podobny pytanie @CommonsWare's komentarz łączy się z to, który implementuje interfejs OnClickListener
w viewHolder
.
Oto'prosty przykład ViewHolder
:
TextView textView;//declare global with in adapter class
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textView = (TextView)view.findViewById(android.R.id.text1);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();
//go through each item if you have few items within recycler view
if(getLayoutPosition()==0){
//Do whatever you want here
}else if(getLayoutPosition()==1){
//Do whatever you want here
}else if(getLayoutPosition()==2){
}else if(getLayoutPosition()==3){
}else if(getLayoutPosition()==4){
}else if(getLayoutPosition()==5){
}
//or you can use For loop if you have long list of items. Use its length or size of the list as
for(int i = 0; i<exampleList.size(); i++){
}
}
}
Adapter
wygląda wtedy tak:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(view);
}
To jest to, czego potrzebowałem, na wypadek, gdyby ktoś uznał to za przydatne:
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View item) {
super(item);
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("RecyclerView", "onClick:" + getAdapterPosition());
}
});
}
}
Źródło: http://blog.csdn.net/jwzhangjie/article/details/36868515