티스토리 뷰
안드로이드 스튜디오 Android studio // RecyclerView 리사이클러뷰 클릭 이벤트(Url로 웹사이트 이동)
Moon96 2022. 6. 14. 16:21프로젝트를 진행하던 도중 메인 액티비티에서 리사이클러 뷰를 통해서
간단한 정보를 제공하고 있었다.

여유가 조금 있는 타이밍에 각 아이템을 클릭하면 해당 복지 정보에 대한 상세 정보를 제공하는
웹사이트로 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) {
}
}
}
어댑터 전체 코드
'안드로이드(Java) > 프로젝트 - ChatBot(챗봇)' 카테고리의 다른 글
안드로이드 스튜디오 Android studio // recyclerView 키보드가 올라오면 자동 스크롤 구현 (0) | 2022.06.20 |
---|---|
안드로이드 스튜디오 Android studio // Intent 화면전환시 효과 주기 (0) | 2022.06.16 |
안드로이드 스튜디오 Android studio // 안드로이드에서 웹사이트 크롤링 (0) | 2022.06.10 |
안드로이드 스튜디오 Android studio // FCM(Firebase Cloud Messaging)을 통한 푸시 알림 보내기 (0) | 2022.06.07 |
안드로이드 스튜디오 Android studio // TTS(Text To Speech) 텍스트 음성 변환 사용하기 (0) | 2022.06.03 |