EMDI는 지금도 개발중

Android : RecyclerView 활용 아이템(데이터) 클릭 이벤트 태우기 본문

네이티브/Android

Android : RecyclerView 활용 아이템(데이터) 클릭 이벤트 태우기

EMDI 2020. 5. 14. 16:52
 

Android : RecyclerView 활용 데이터 추가

1. RecyclerView란? ListView의 기능을 보완하기 위해서 만들어진 뷰. 기존의 ListView에서 레이아웃 매니저를 추가하여 리스트 타입을 쉽게 변경할 수 있습니다. 또한 ListView와 다르게 Viewholder의 사용이 �

milkoon1.tistory.com

지난 글에서는 RecyclerView를 생성하고 데이터 Item을 뿌려주는 과정까지 했습니다. 이번 글에서는 해당 Item을 클릭했을 때 이벤트를 처리를 하는 방법에 대해 알아보도록 하겠습니다.

 

1. ListView와 RecyclerView의 차이

보통 ListView는 단순히 데이터를 리스트 형태로 보여주기 위해 사용하지만, 리스트 아이템 자체를 선택 가능하도록 만들어 메뉴처럼 사용할 수도 있습니다. ListView가 사용자의 아이템 터치 입력을 받을 수 있도록 만드려면 ListView에 Click 이벤트에 대한 리스너를 정해주면 됩니다.

  listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        // 코드 계속 ...

        @Override
        public void onItemClick(AdapterView parent, View v, int position, long id) {

            // get TextView's Text.
            String strText = (String) parent.getItemAtPosition(position) ;

            // TODO : use strText
        }
    }) ;

onItemClick() 함수에서 ListView 아이템인 TextView의 텍스트를 가져오려면 위의 주석처럼 parent.getItemAtPostition()함수를 사용하면 됩니다. ListView를 이용한 것처럼 RecylcerView도 단순하게 사용할 수 있을거라 생각했지만 ListView에 비해 RecyclerView는 훨씬 유연하고 다양한 형태로 아이템을 표시하게 만들어줍니다. RecyclerView는 레이아웃매니저(LayoutManager)를 통해 아이템을 배치하는 형태를 다양하게 구성할 수 있고, 애니메이션 효과 등을 쉽게 적용할 수 있어 다이나믹한 화면 구성이 가능합니다. 단, 이러한 다이나믹한 장점이 오히려 아이템 클릭 이벤트 처리를 복잡하게 만드는 요인이 되버리죠.

 

2. RecyclerView의 ViewHolder를 이용하여 아이템 클릭 이벤트 처리하기

   public class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(@NonNull View view) {
            super(view);

            // 아이템 클릭 이벤트 처리.
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO : process click event.
                }
            });
        }
    }

아이템뷰에서 클릭이벤트를 직접 처리하게 하고 아이템 뷰는 뷰홀더 객체를 가지고 있으니 아이템 클릭 이벤트는 뷰홀더에서 작성합니다. 여기까지 오셨으면 이제 아이템 클릭 이벤트를 사용할 수 있게 되었습니다. 단, 여기서 끝나는게 아니고 하나 더 작업을 해야하는데 그것은 이제 현재 클릭 이벤트가 발생된 아이템의 위치(Posittion)을 알아내는 것입니다. 보통 RecylcerView를 사용할 때 우리는 단순 Alert이나 띄우려고 사용하지 않습니다. 해당 아이템과 연결된 데이터를 확인하려거나 그 데이터를 가지고 가공하려고 클릭 이벤트를 구현하죠.  

 

1) 현재 자신의 위치(Position) 확인하기

    public class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(@NonNull View view) {
            super(view);
            
            // 아이템 클릭 이벤트 처리.
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = getAdapterPosition() ;
                    if (pos != RecyclerView.NO_POSITION) {
                        // TODO : use pos.
                    }
                }
            });
        }
    }

ViewHolder에는 현재 자신의 위치를 확인할 수 있는 getAdapterposition()이라는 메서드를 제공하고있습니다. 그래서 우리는 이 메서드를 이용해서 Position을 알아내보도록 합시다. 여기서 RecylcerView.NO_POSITION이 아닌지 검사하는 이유는 notifyDataSetChanged()에 의해 RecyclerView가 아이템뷰를 갱신하는 과정에서 ViewHolder가 참조하는 아이템이 어뎁터에서 삭제되면 getAdapterPosition()의 메서드는 NO_POSITION을 리턴하기 때문입니다.

 

2) Position에 있는 데이터 리스트 접근하기

RecyclerAdapter.java

public class ViewHolder extends RecyclerView.ViewHolder{

    public ViewHolder(@NonNull View view) {
    	super(view);

    	// 아이템 클릭 이벤트 처리.
    	itemView.setOnClickListener(new View.OnClickListener() {
    		@Override
    		public void onClick(View v) {
    			int pos = getAdapterPosition() ;
    			if (pos != RecyclerView.NO_POSITION) {
    				// 리스너 객체의 메서드 호출.
    				if (mListener != null) {
   					mListener.onItemClick(v, pos) ;
    				}
    			}
    		}
    	});
    }
}
    
// 리스너 객체 참조를 저장하는 변수
private OnItemClickListener mListener = null ;

// OnItemClickListener 리스너 객체 참조를 어댑터에 전달하는 메서드
public void setOnItemClickListener(OnItemClickListener listener) {
	this.mListener = listener ;
}

public interface OnItemClickListener {
	void onItemClick(View v, int position) ;
}

그 다음은 아이템 위치에 있는 데이터 리스트를 접근하는 방법입니다. 저는 우선 해당 Position 정보만 받는걸로 처리하겠습니다.

 

MainActivity.java

private ListActivity getCertInfo;

// 선택한 인증서 정보 받기
adapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View v, int position) {
        // TODO : 아이템 클릭 이벤트를 MainActivity에서 처리.
        getCertInfo = listBundle.get(position) ;
    }
}) ;

 

그 다음 MainActivity.java 에서 position 정보를 받아서 getCertInfo라는 변수에 담아놓습니다.

Comments