RecyclerView 를 프로그램적으로 클릭(강제클릭)이 가능한가요?


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));
    }
}
  • 2016년 04월 06일에 작성됨
    툭탁틱틱 류군
조회수 469


1 답변


좋아요
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" />

조금이라도 도움이 되셨으면 좋겠습니다.

  • 2016년 04월 09일에 작성됨
    안드로이드, 루비온레일즈

  • 감사합니다~ 한번 테스트 해보겠습니다. 일단은 현재 해당 문제에 대해서는 우회(?)적인 방법을 통해서 해결은 했지만, 수정이 필요하기는 하네요. 그래서 현재 프로젝트가 마무리될때쯤 코드 전체를 다시 훑으면서 수정할때 해보겠습니다. 답변 정말 감사합니다 ^^    류군   2016.4.12 10:18     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close