GONE에서 VISIBLE이 안 될 때💦
RecyclerView의 Adapter에서 View를 GONE으로 설정한 후,
Click Event를 받아 VISIBLE-GONE을 토글하려고 했다.
이런 코딩을 많이 했었으니까 금방 하지'ㅅ' 했는데 웬결 VISIBLE이 안 먹는다.
VISIBLE로 설정한 후 GONE과 VISIBLE의 토글은 아주 잘 됨
찾아보니 이런 경우가 꽤 있는 것 같은데 명확한 답이 없더라
그러던 중
이 생각을 안 한 건 아니지...
그래도 속는 셈 치고 notifyDataSetChanged(position)을 추가해봤다.
((ListViewHolder) holder).parentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mSelectedItems.get(position, false)) {
mSelectedItems.put(position, false);
((ListViewHolder) holder).detailView.setVisibility(View.GONE);
} else {
mSelectedItems.put(position, true);
((ListViewHolder) holder).detailView.setVisibility(View.VISIBLE);
}
notifyItemChanged(position);
}
});
이게 왜 돼?
어젠 안 됐잖아.... 일단 됐으니 됐다 😮💨
❤️안 됨❤️
처음부터 GONE을 설정했을 때 Layout 어쩌구 저쩌구라는 글을 봤는데
그래서 어떻게 해결해야될지 모르겠다..
이게 또 아예 토글이 안 되는 게 아니라 RecyclerView를 몇 번 왔다리 갔다리 하면 또 된다
그 중에서 안 되는 뷰들이 또 몇 개 있음
안 될거면 아예 안 되던가..? 어떤 오류인지 가늠조차 되지를 않아서 야매로 코드 수정 ㅠ
if (mSelectedItems.get(position, false)) {
((ListViewHolder) holder).detailView.setVisibility(View.VISIBLE);
} else {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
((ListViewHolder) holder).detailView.setVisibility(View.GONE);
}
}, 1);
}
Delay를 이용해서 VISIBLE에서 GONE으로 변경해줌
그럼 아주 잘 된다.. 초반에 리스트 불러올 때 좀 엥스럽긴 하지만
어쩔 수 없어요.. 기능이 안 되는 것보단 나을겁니다..
이런 글을 전체공개로 해도 되는건가? ㅋㅋㅋㅋㅋ 실력 없는 거 인정해버리기~
SparseBooleanArray mSelectedItems = new SparseBooleanArray(0);
//토글을 위한 Array
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if (viewType == DATE_CONTENT) {
view = LayoutInflater.from(context).inflate(R.layout.item_list_date, parent, false);
return new DateViewHolder(view);
} else {
view = LayoutInflater.from(context).inflate(R.layout.item_protocol, parent, false);
return new ListViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ProtocolModel model = protocolList.get(position);
if (holder instanceof DateViewHolder) {
((DateViewHolder) holder).dateTxt.setText(model.getDate());
} else if (holder instanceof ListViewHolder) {
List<PersonModel> driverList = new ArrayList<>(getPersonModel(InfoAdapter.DRIVER, model.getDriver()));
InfoAdapter driverAdapter = new InfoAdapter(context, driverList, infoSelectListener);
((ListViewHolder) holder).driverView.setAdapter(driverAdapter);
if (mSelectedItems.get(position, false)) {
((ListViewHolder) holder).detailView.setVisibility(View.VISIBLE);
} else {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
((ListViewHolder) holder).detailView.setVisibility(View.GONE);
}
}, 1);
}
}
}
}
@Override
public int getItemCount() {
return protocolList.size();
}
@Override
public int getItemViewType(int position) {
return protocolList.get(position).getViewType();
}
class DateViewHolder extends RecyclerView.ViewHolder {
TextView dateTxt;
public DateViewHolder(@NonNull View itemView) {
super(itemView);
dateTxt = itemView.findViewById(R.id.dateTxt);
}
}
class ListViewHolder extends RecyclerView.ViewHolder {
LinearLayout parentView;
View detailView;
RecyclerView driverView;
public ListViewHolder(@NonNull View itemView) {
super(itemView);
parentView = itemView.findViewById(R.id.parentView);
detailView = itemView.findViewById(R.id.detailView);
driverView = itemView.findViewById(R.id.driverView);
driverView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false));
parentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mSelectedItems.get(getAdapterPosition(), false)) {
Log.i("HYUN", getAdapterPosition() + " : true GONE");
mSelectedItems.put(getAdapterPosition(), false);
detailView.setVisibility(View.GONE);
} else {
mSelectedItems.put(getAdapterPosition(), true);
Log.i("HYUN", getAdapterPosition() + " : false VISIBLE");
detailView.setVisibility(View.VISIBLE);
}
notifyItemChanged(0, getItemCount());
}
});
}
}
클릭 이벤트는 onBindViewHolder()보다 ViewHolder Class 안에 있는 것이 성능이 좋다고 해서 변경!
참고 자료
https://steemit.com/android/@kmshack/recyclerview
--> 읽어보면 좋을 것 같아서 스크랩📚
https://medium.com/@wodbs135/recyclerview%EB%A5%BC-%EB%8D%94-%EC%9E%98-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-879cd52bcdba
Author And Source
이 문제에 관하여(GONE에서 VISIBLE이 안 될 때💦), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lloxl62/GONE에서-VISIBLE이-안-될-때저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)