728x90
RecyclerView가 보여주는 ITEM VIEW 들을 만들어주는 adapter에서 사용하는 ViewHolder의 아이템뷰에 view binding을 적용하는 것이다.
테스트를 하다보니 RecyclerView 를 적용한 Adapter 와 Activity 모두 view binding 을 적용해야 이미지가 정상적으로 보이는 것을 확인할 수 있었다.
변경되는 사항
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 새로운 뷰를 만든다.
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.address_item,parent,false);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
AddressItemBinding binding = AddressItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new ViewHolder(binding);
}
|
public class ViewHolder extends RecyclerView.ViewHolder {
View layout;
ImageView photoImg;
TextView tv_name;
TextView tv_mobileNO;
TextView tv_telNO;
ImageView call_btn;
CheckBox cbSelect;
public ViewHolder(@NonNull View itemView) {
super(itemView);
// 화면에 표시될 View 로부터 위젯에 대한 참조 획득
layout = itemView.findViewById(R.id.child_layout);
photoImg = itemView.findViewById(R.id.profile_Image);
tv_name = itemView.findViewById(R.id.child_name);
tv_mobileNO = itemView.findViewById(R.id.child_mobileNO);
tv_telNO = itemView.findViewById(R.id.child_telNO);
call_btn = itemView.findViewById(R.id.child_Btn);
cbSelect = itemView.findViewById(R.id.list_cell_checkbox);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
AddressItemBinding itemBinding;
public ViewHolder(@NonNull AddressItemBinding binding) {
super(binding.getRoot());
itemBinding = binding;
}
void bindItem(Address_Item item){
if(!TextUtils.isEmpty(item.getPhoto())){
Glide.with(mContext).load(item.getPhoto()).into(itemBinding.profileImage);
}
itemBinding.childName.setText(item.getUserNM());
itemBinding.childMobileNO.setText(PhoneNumberUtils.formatNumber(item.getMobileNO()));
itemBinding.childTelNO.setText(PhoneNumberUtils.formatNumber(item.getTelNO()));
itemBinding.childBtn.setOnClickListener(v -> {
});
itemBinding.listCellCheckbox.setChecked(item.getCheckBoxState());
}
}
|
View Binding을 적용한 코드
package com.link2me.android.sample.adapter;
import static com.link2me.android.sample.main.AddrBindActivity.constraintLayout;
import static com.link2me.android.sample.main.AddrBindActivity.isCheckFlag;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.link2me.android.sample.R;
import com.link2me.android.sample.databinding.AddressItemBinding;
import com.link2me.android.sample.model.Address_Item;
import com.link2me.android.sample.network.RetrofitUrl;
import java.util.ArrayList;
public class BindListViewAdapter extends RecyclerView.Adapter<BindListViewAdapter.ViewHolder> {
private final String TAG = this.getClass().getSimpleName();
Context context;
private ArrayList<Address_Item> rvItemList;
// 인터페이스 선언 -------------------------------------------------------------
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClicked(View view, Address_Item item, int position);
}
public void setOnItemSelectClickListener(OnItemClickListener listener){
mListener = listener;
}
// 인터페이스 ----------------------------------------------------------------
public BindListViewAdapter(Context context, ArrayList<Address_Item> items) {
this.context = context;
rvItemList = items;
}
public void selectAll(){ // checkbox 전체 선택
for(int i=0;i < rvItemList.size();i++){
rvItemList.get(i).setCheckBoxState(true);
}
notifyDataSetChanged();
}
public void unselectall(){ // checkbox 전체 해제
for(int i=0;i < rvItemList.size();i++){
rvItemList.get(i).setCheckBoxState(false);
}
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 새로운 뷰를 만든다.
AddressItemBinding binding = AddressItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new ViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull BindListViewAdapter.ViewHolder holder, int position) {
holder.bindItem(rvItemList.get(position), position);
}
@Override
public int getItemCount() {
return rvItemList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
AddressItemBinding itemBinding;
public ViewHolder(@NonNull AddressItemBinding binding) {
super(binding.getRoot());
itemBinding = binding;
}
void bindItem(Address_Item item, int position){
String photoURL = RetrofitUrl.BASE_URL + "photos/" + item.getPhoto();
if(photoURL.contains("null")){
Glide.with(context).asBitmap().load(R.drawable.photo_base).into(itemBinding.profileImage);
} else {
Glide.with(context).asBitmap().load(photoURL).into(itemBinding.profileImage);
}
itemBinding.childName.setText(item.getUserNM());
itemBinding.childMobileNO.setText(PhoneNumberUtils.formatNumber(item.getMobileNO()));
itemBinding.childOfficeNO.setText(PhoneNumberUtils.formatNumber(item.getTelNO()));
itemBinding.profileImage.setOnClickListener(view1 -> {
if(mListener != null){
mListener.onItemClicked(view1,item,position);
// 클릭의 결과로 값을 전달
Log.e(TAG,"item clicked : "+position);
}
});
final String[] items ={"휴대폰 전화걸기","사무실전화 걸기"};
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("해당작업을 선택하세요");
builder.setItems(items, (dialog, which) -> {
Toast.makeText(context, items[which] + "선택했습니다.", Toast.LENGTH_SHORT).show();
switch (which){
case 0:
if(item.getMobileNO().length() ==0){
Toast.makeText(context, "전화걸 휴대폰 번호가 없습니다.",Toast.LENGTH_SHORT).show();
break;
}
AlertDialog dialog1 = new AlertDialog.Builder(context)
.setTitle(item.getUserNM())
.setMessage(PhoneNumberUtils.formatNumber(item.getMobileNO()) + " 통화하시겠습니까?")
.setPositiveButton("예",
(dialog23, which13) -> {
Intent intent = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + PhoneNumberUtils.formatNumber(item.getMobileNO())));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
})
.setNegativeButton(
"아니오",
(dialog22, which12) -> dialog22.dismiss()).create();
dialog1.show();
break;
case 1:
if(item.getTelNO().length() ==0){
Toast.makeText(context, "전화걸 사무실 번호가 없습니다.",Toast.LENGTH_SHORT).show();
break;
}
AlertDialog dialog2 = new AlertDialog.Builder(context)
.setTitle(item.getUserNM())
.setMessage(PhoneNumberUtils.formatNumber(item.getTelNO()) + " 통화하시겠습니까?")
.setPositiveButton("예",
(dialog3, which1) -> {
Intent intent = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + PhoneNumberUtils.formatNumber(item.getTelNO())));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
})
.setNegativeButton(
"아니오",
(dialog32, which14) -> dialog32.dismiss()).create();
dialog2.show();
break;
}
});
builder.create();
itemBinding.callBtn.setOnClickListener(v -> builder.show());
if (isCheckFlag == false) {
itemBinding.callBtn.setVisibility(View.VISIBLE);
itemBinding.callBtn.setOnClickListener(view -> builder.show());
itemBinding.listcellCheckbox.setVisibility(View.GONE);
itemBinding.childLayout.setOnClickListener(view ->
Toast.makeText(context, "상세보기를 눌렀습니다 ===" + item.getIdx(), Toast.LENGTH_SHORT).show());
itemBinding.childLayout.setOnLongClickListener(v -> {
isCheckFlag = true;
constraintLayout.setVisibility(View.VISIBLE);
notifyDataSetChanged();
return true;
});
} else {
itemBinding.callBtn.setVisibility(View.GONE);
//convertView.setClickable(false);
itemBinding.listcellCheckbox.setVisibility(View.VISIBLE);
itemBinding.listcellCheckbox.setTag(position); // This line is important.
// 체크 박스 클릭하면 CheckBoxState 에 반영한다. setOnCheckedChangeListener 대신 사용
itemBinding.listcellCheckbox.setOnClickListener(v -> {
if(rvItemList.get(position).getCheckBoxState() == true){
rvItemList.get(position).setCheckBoxState(false);
Log.d("checkbox","position : "+ position + " checkBoxState === "+ rvItemList.get(position).getCheckBoxState());
} else {
rvItemList.get(position).setCheckBoxState(true);
Log.d("checkbox","position : "+ position + " checkBoxState === "+ rvItemList.get(position).getCheckBoxState());
}
});
itemBinding.childLayout.setOnClickListener(v -> {
if(itemBinding.listcellCheckbox.isChecked() == false){
itemBinding.listcellCheckbox.setChecked(true);
rvItemList.get(position).setCheckBoxState(true);
//notifyDataSetChanged();
Log.d("checklist","position : "+ position + " checkBoxState === "+ rvItemList.get(position).getCheckBoxState());
} else {
itemBinding.listcellCheckbox.setChecked(false);
rvItemList.get(position).setCheckBoxState(false);
//notifyDataSetChanged();
Log.d("checklist","position : "+ position + " checkBoxState === "+ rvItemList.get(position).getCheckBoxState());
}
});
}
// 재사용 문제 해결
if(rvItemList.get(position).getCheckBoxState() == true){
itemBinding.listcellCheckbox.setChecked(true);
Log.d("ReUse","position : " + position + " checkBoxState === " + rvItemList.get(position).getCheckBoxState());
} else {
itemBinding.listcellCheckbox.setChecked(false);
Log.d("ReUse","position : "+position + " checkBoxState ===" + rvItemList.get(position).getCheckBoxState());
}
}
}
}
|
728x90
'안드로이드 > ListView, RecyclerView' 카테고리의 다른 글
Recyclerview with Retrofit and ListAdapter using MVVM (0) | 2022.08.28 |
---|---|
[java] RecyclerView ListAdapter DiffUtil (0) | 2022.08.24 |
[코틀린] expandable recyclerview 예제 (0) | 2021.06.03 |
RecyclerView 역순으로 리스트 출력하기 (0) | 2020.08.05 |
RecyclerView Checkbox 처리 및 Interface 처리 (0) | 2020.07.17 |