recyclerview 안에 recyclerview

조회수 2516회

안녕하세요 어떤 프래그먼트에서 recyclerview 안에 json 데이터를 받아와 뿌려주고 뷰를 클릭했을 때 밑에 Gone햇던 뷰가 나타나게 했습니다. 그런데 나타난 뷰 안에 또 json 데이터를 받아오려고 하는데 recyclerView 속에 recyclerView를 넣는 것이 가능한가요? 만약 안되면 어떤 방식으로 해야하나요? ㅜ

2 답변

  • 물론 가능합니다. 단순히 ViewGroup안에 ViewGroup를 넣는 것이라고 생각하면 이해가 쉽지않을까 싶고요. 예전에도 유사한 질문에 답변을 남겨지만 짚고 넘어가야 할 부분이 리사이클러뷰 안에 리사이클러뷰를 넣어야지만 만들 수 있는 UI인가 입니다.

    1. 리사이클러뷰의 아이템을 클릭
    2. 숨겨져있던 뷰를 보이도록 처리
    3. 서버로부터 데이터 요청 (빈 화면이 어색하다면 로딩 프로그레스 노출)
    4. 데이터를 성공적으로 받으면 View에 데이터를 바인드

    대략 이런 흐름이 될 것 같은데요. 4번에서 받은 데이터를 View로 보여줄 때, 리사이클러뷰의 대안으로 LinearLayout, RelativeLayout과 같은 뷰그룹으로 만들 수 있는 뷰인지 확인 해보세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 네네 예전에도 비슷한 질문을 해서 답변을 해주셨어요!! 1, 2 번은 가능해졌어요! 그런데 숨겨져있던 뷰를 보이도록 하고 그 뷰에서 json 데이터를 또 받아와야 하는데 데이터가 적을수도 있고 많을수도 있어서 리스트뷰나 리사이클러뷰에다 넣어서 보여줘야 하는데요. 음 데이터 요청을 어디서 해야 하나요? 제 어댑터를 밑에 답변에 첨부할게요 kyudongPark 2017.3.13 13:33
  • @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    
        final BestCommentsRvItem item = bestCommentsRvItemArrayList.get(position);
    
        holder.Best_comments_Name.setText(item.best_comments_name);
        holder.Best_comments_content.setText(item.spanned_content);
        holder.Best_comments_replyCounts.setText(item.best_comments_replyCounts);
        holder.Best_comments_likeCount.setText(item.best_comments_likeCount);
        holder.Best_comments_dislikeCount.setText(item.best_comments_dislikeCount);
        holder.Best_comments_Time.setText(item.best_comments_time);
    
        holder.Best_RvLL.setVisibility(item.visibility ? View.GONE : View.VISIBLE);
    
        holder.Best_comments_replyCounts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(item.visibility) {
                    try {
                        adapter2 = new ReplyCommentsRvAdapter(replyCommentsRvItemArrayList2);
                        holder.Best_comments_RvRv.setAdapter(adapter2);
                        writeReplyCommentInterface.doGetReplyRequest(url + item.id, adapter2,
                                replyCommentsRvItemArrayList2);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    holder.Best_RvLL.setVisibility(View.VISIBLE);
                    item.visibility=false;
                } else if(!item.visibility) {
                    holder.Best_RvLL.setVisibility(View.GONE);
                    item.visibility=true;
                }
            }
        });
    
        Picasso.with(context).load(item.getBest_comments_ImageView()).resize(70,70).into(holder.Best_comments_Iv);
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
    
        TextView Best_comments_Name;
        TextView Best_comments_Time;
        ImageView Best_comments_Iv;
        TextView Best_comments_content;
        TextView Best_comments_replyCounts;
        TextView Best_comments_likeCount;
        TextView Best_comments_dislikeCount;
        //TextView Best_comments_BEST;
    
        LinearLayout Best_RvLL;
        LinearLayout Best_LL;
        RecyclerView Best_comments_RvRv;
        LinearLayoutManager llm2;
    
        public ViewHolder(View itemView) {
            super(itemView);
    
            Best_comments_Name = (TextView) itemView.findViewById(R.id.best_comments_name);
            Best_comments_Time = (TextView) itemView.findViewById(R.id.best_comments_time);
            Best_comments_content = (TextView) itemView.findViewById(R.id.best_comments_content);
            Best_comments_likeCount = (TextView) itemView.findViewById(R.id.best_comments_likeCount);
            Best_comments_dislikeCount = (TextView) itemView.findViewById(R.id.best_comments_dislikeCount);
            Best_comments_replyCounts = (TextView) itemView.findViewById(R.id.best_comments_replyCounts);
            Best_comments_Iv = (ImageView) itemView.findViewById(R.id.best_comments_Iv);
    
           // Best_comments_BEST = (TextView) itemView.findViewById(R.id.best_comments_BEST);
    
            Best_RvLL = (LinearLayout) itemView.findViewById(R.id.bestRVLL);
            Best_LL = (LinearLayout) itemView.findViewById(R.id.bestLL);
    
            Best_comments_RvRv = (RecyclerView) itemView.findViewById(R.id.bestRvRv);
            llm2 = new LinearLayoutManager(itemView.getContext());
            llm2.setOrientation(LinearLayoutManager.VERTICAL);
            Best_comments_RvRv.setLayoutManager(llm2);
        }
    }
    

    }

    이런식으로 리사이클러뷰의 어댑터 속에 또 하나의 리사이클러뷰를 넣었는데 데이터 통신을 인터페이스를 통해서 부모 리사이클러뷰를 정의해서 통신했던 액티비티에서 하려고 했는데 잘 안되네요 ㅜ 어떡해야할까요

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)