GONE에서 VISIBLE이 안 될 때💦

6260 단어 androidandroid

RecyclerView의 Adapter에서 View를 GONE으로 설정한 후,
Click Event를 받아 VISIBLE-GONE을 토글하려고 했다.
이런 코딩을 많이 했었으니까 금방 하지'ㅅ' 했는데 웬결 VISIBLE이 안 먹는다.

VISIBLE로 설정한 후 GONE과 VISIBLE의 토글은 아주 잘 됨
찾아보니 이런 경우가 꽤 있는 것 같은데 명확한 답이 없더라

그러던 중


(출처 : https://www.masterqna.com/android/146/android-visibility-%EB%AC%B8%EC%A0%9C-%EC%A7%88%EB%AC%B8%ED%95%A9%EB%8B%88%EB%8B%A4)

이 생각을 안 한 건 아니지...
그래도 속는 셈 치고 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

좋은 웹페이지 즐겨찾기