RecyclerView 를 프로그램적으로 클릭(강제클릭)이 가능한가요?
조회수 3874회
RecyclerView 를 적용하고 있습니다. 현재 막히는 부분은 특정 이벤트 후에 다음 Item 으로 강제로 클릭하는 onClick 이벤트가 발생했으면 하는것입니다.
구글링 하다보니 stackoverflow 에 아래와 같은 방법이 있더군요.
recyclerView.findViewHolderForAdapterPosition(position).itemView.performClick();
그런데 Actcivity 에 적용시켜봤지만, 저에게는 적용되지가 않던데 어떻게 사용하는건지 모르겠네요.
ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView virtNo;
private TextView score01;
private TextView score02;
private TextView score03;
private TextView totalScore;
private LinearLayout linearLayout;
public ViewHolder(View itemView) {
super(itemView);
this.virtNo = (TextView) itemView.findViewById(R.id.tv_virtNo);
this.score01 = (TextView) itemView.findViewById(R.id.tv_score01);
this.score02 = (TextView) itemView.findViewById(R.id.tv_score02);
this.score03 = (TextView) itemView.findViewById(R.id.tv_score03);
this.totalScore = (TextView) itemView.findViewById(R.id.tv_totalScore);
this.linearLayout = (LinearLayout) itemView.findViewById(R.id.ll_item_score);
virtNo.setOnClickListener(this);
score01.setOnClickListener(this);
score02.setOnClickListener(this);
score03.setOnClickListener(this);
score10.setOnClickListener(this);
}
@Override
public void onClick(View v) {
onClickListener.onClick(v, getAdapterPosition(), items.get(getAdapterPosition()));
}
}
onClickListener
public void setOnClickListener(OnClickListener<Score> onClickListener) {
this.onClickListener = onClickListener;
}
public interface OnClickListener<T> {
void onClick(View v, int position, T item);
}
onBindViewHolder
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Score item = items.get(position);
holder.virtNo.setText(item.virtNo);
holder.score01.setText(item.score01);
holder.score02.setText(item.score02);
holder.score03.setText(item.score03);
holder.totalScore.setText(itemSum(item));
}
}
1 답변
-
NullPointerException은 안났다고 하셨으니
recyclerView.findViewHolderForAdapterPosition(position)
해서 뷰홀더는 성공적으로 가져오셨네요. :)recyclerView.findViewHolderForAdapterPosition(position)
이렇게 호출하면 ViewHolder가 통째로 리턴되는데요. performClick을 호출하면 아마 전체를 감싸고 있는 레이아웃에 click이 먹혀서 원하는대로 동작을 안한것 같습니다.저는 아주 간단하게 TextView만 가지고 있는 ViewHolder로 테스트를 해보았는데요 잘 동작하였습니다.
final CustomAdapter.ViewHolder holder = (CustomAdapter.ViewHolder) mRecyclerView.findViewHolderForPosition(0); holder.getTextView().performClick();
public static class ViewHolder extends RecyclerView.ViewHolder { private final TextView textView; public ViewHolder(View v) { super(v); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Element " + getPosition() + " clicked."); } }); textView = (TextView) v.findViewById(R.id.textView); } public TextView getTextView() { return textView; } }
뷰xml은 아래와 같습니다. TextView를 FrameLayout으로 감쌌더니 performClick이 안먹더군요. FrameLayout도 제거하고 TextView만 남겨두니 performClick이 동작하였습니다.
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="@dimen/list_item_height" android:layout_marginLeft="@dimen/margin_medium" android:layout_marginRight="@dimen/margin_medium" android:gravity="center_vertical" android:text="@string/element_text" />
조금이라도 도움이 되셨으면 좋겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력