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

조회수 3873회

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 답변

  • 좋아요

    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.4.12 10:18

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)