티스토리 뷰

프로젝트를 진행하던 도중 메인 액티비티에서 리사이클러 뷰를 통해서 

간단한 정보를 제공하고 있었다.

 

여유가 조금 있는 타이밍에 각 아이템을 클릭하면 해당 복지 정보에 대한 상세 정보를 제공하는

웹사이트로 Intent 하도록 구현을 하고자 했다.

 

열심히 구글링을 한 결과 리사이클러뷰 클릭 이벤트 자체는 구현하기 쉬웠지만

각각 아이템별로 url을 부여하는 난관에 부딪혔다.

 

약 6시간정도 실패를 거듭한 결과 겨우 해결방법을 찾아낼 수 있었다.

 

일단 클릭이벤트는 액티비티 또는 리사이클러뷰 어댑터에서 구현할 수 있었는데

대부분의 자료들이 어댑터에서 클릭이벤트를 구현하고 있었다.

 

나는 어댑터의 onBindViewHolder의 매개변수 holder.itemView에 클릭 이벤트를 생성하였다.

@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
    // Item을 하나, 하나 보여주는(bind 되는) 함수입니다.
    holder.onBind(listData.get(position));
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(listData.get(holder.getAdapterPosition()).getUri()));
            context.startActivity(intent);
        }
    });
}

코드를 보자면

 

웹사이트로 이동을 하기 위해서는 Intent() 안에 Intent.ACTION_VIEW를 넣어줘야 했다.

만약 웹사이트이동이 아닌 액티비티 전환을 하려면 Context를 사용하여 parent.getContext()를 사용해주어야 한다.

 

이제 각 아이템별로 url 주소를 부여하는 내용인데 

사실 구현하고 보니 정말 간단한 문제였다.

 

일단 각 어댑터 안에는 외부에서 아이템을 추가할 수 있도록 addItem이라는 함수가 존재한다
이를 통해 우리는 외부(다른 액티비티)에서 설정한 값들을 어댑터에서 불러올 수 있었다.

 

private ArrayList<Data> listData = new ArrayList<>();

먼저 어탭터 전역에 우리가 불러오려고 하는 타입의 리스트를 추가해준다.

 

void addItem(Data data) {
    // 외부에서 item을 추가시킬 함수입니다.
    listData.add(data);
}

그러면 addItem에서 해당 리스트에 외부에서 지정한 값들을 추가할 수 있다.

 

이제 listData라는 리스트에서 내가 필요한 url값을 가져오기 위해서 listData.get() 함수를 사용하는데

이 안에 각각 아이템을 불러오는 

holder.getAdapterPosition()

이 코드가 들어가야 한다.

 

이틀간 몇시간에 걸친 노력이 저 쉬운 코드였다는점에 허탈했지만

어쨌든 문제를 해결하고 구현을 했다는 점에서 보람을 느낄수 있었다.

 

 

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemViewHolder> {
    // adapter에 들어갈 list 입니다.
    private ArrayList<Data> listData = new ArrayList<>();
    Context context;
    Data data;

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // LayoutInflater를 이용하여 전 단계에서 만들었던 item.xml을 inflate 시킵니다.
        // return 인자는 ViewHolder 입니다.
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

        context = parent.getContext();
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        // Item을 하나, 하나 보여주는(bind 되는) 함수입니다.
        holder.onBind(listData.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(listData.get(holder.getAdapterPosition()).getUri()));
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        // RecyclerView의 총 개수 입니다.
        return listData.size();
    }

    void addItem(Data data) {
        // 외부에서 item을 추가시킬 함수입니다.
        listData.add(data);
    }

    // RecyclerView의 핵심인 ViewHolder 입니다.
    // 여기서 subView를 setting 해줍니다.
    class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        private TextView textView1;
        private TextView textView2;
        private ImageView imageView;

        public ItemViewHolder(View itemView) {
            super(itemView);

            textView1 = itemView.findViewById(R.id.textView1);
            textView2 = itemView.findViewById(R.id.textView2);
            imageView = itemView.findViewById(R.id.imageView);
        }

        void onBind(Data data) {
            textView1.setText(data.getTitle());
            textView2.setText(data.getContent());
            imageView.setImageResource(data.getResId());
        }

        @Override
        public void onClick(View view) {

        }
    }

}

어댑터 전체 코드

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함