2017-10-31 11 views
1

내 응용 프로그램에서 RecyclerView를 사용하여 사용자 포럼을 만듭니다.왜 RecyclerView 항목이 잘못된 위치에 나타 납니까?

하지만 항목의 위치에 문제가 있습니다. 때로는 항목이 잘못된 위치에 표시됩니다! 일부 항목은 두 번 뿌리고 일부 항목은 표시되지 않습니다. 나는 내 recyclerView에서보기가 다르고 그 때문에 다중 뷰를 사용했다.

은 내가 사용하고 내 recyclerView 어댑터입니다 :

public class chatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private final ArrayList<ChatModel> chatArray = new ArrayList<>(); 
    private Context mContext; 
    FragmentForum fragmentForum; 

    public chatAdapter(ArrayList<ChatModel> chatArray, Context mContext, FragmentForum fragmentForum) { 
    this.chatArray.addAll(chatArray); 
    this.mContext = mContext; 
    this.fragmentForum = fragmentForum; 
    } 


    public static class ViewHolderNoFile extends RecyclerView.ViewHolder { 

    ImageView reply; 
    TextView qText; 
    TextView aText; 
    TextView aUserName; 
    TextView qUserName; 
    LinearLayout layoutAnswer; 


    public ViewHolderNoFile(View v) { 
     super(v); 

     reply = (ImageView) v.findViewById(R.id.imgReplay); 
     qText = (TextView) v.findViewById(R.id.txt_question); 
     aText = (TextView) v.findViewById(R.id.txt_answer); 
     aUserName = (TextView) v.findViewById(R.id.txt_a_user_name); 
     qUserName = (TextView) v.findViewById(R.id.txt_q_user_name); 
     layoutAnswer = (LinearLayout) v.findViewById(R.id.answer_box_item); 

    } 
    } 

    public static class ViewHolderQFile extends RecyclerView.ViewHolder { 

    ImageView qImage; 
    ImageView reply; 
    TextView qText; 
    TextView aText; 
    TextView aUserName; 
    TextView qUserName; 
    LinearLayout layoutAnswer; 


    public ViewHolderQFile(View v) { 
     super(v); 

     qImage = (ImageView) v.findViewById(R.id.img_question); 
     reply = (ImageView) v.findViewById(R.id.imgReplay); 
     qText = (TextView) v.findViewById(R.id.txt_question); 
     aText = (TextView) v.findViewById(R.id.txt_answer); 
     qUserName = (TextView) v.findViewById(R.id.txt_q_user_name); 
     aUserName = (TextView) v.findViewById(R.id.txt_a_user_name); 
     layoutAnswer = (LinearLayout) v.findViewById(R.id.answer_box_item); 

    } 
    } 

    public static class ViewHolderAFile extends RecyclerView.ViewHolder { 

    ImageView aImage; 
    ImageView reply; 
    TextView qText; 
    TextView aText; 
    TextView aUserName; 
    TextView qUserName; 
    LinearLayout layoutAnswer; 


    public ViewHolderAFile(View v) { 
     super(v); 

     aImage = (ImageView) v.findViewById(R.id.img_answer); 
     reply = (ImageView) v.findViewById(R.id.imgReplay); 
     qText = (TextView) v.findViewById(R.id.txt_question); 
     aText = (TextView) v.findViewById(R.id.txt_answer); 
     aUserName = (TextView) v.findViewById(R.id.txt_a_user_name); 
     qUserName = (TextView) v.findViewById(R.id.txt_q_user_name); 
     layoutAnswer = (LinearLayout) v.findViewById(R.id.answer_box_item); 

    } 
    } 

    public static class ViewHolderQAFile extends RecyclerView.ViewHolder { 

    ImageView qImage; 
    ImageView aImage; 
    ImageView reply; 
    TextView qText; 
    TextView aText; 
    TextView aUserName; 
    TextView qUserName; 
    LinearLayout layoutAnswer; 


    public ViewHolderQAFile(View v) { 
     super(v); 

     qImage = (ImageView) v.findViewById(R.id.img_question); 
     aImage = (ImageView) v.findViewById(R.id.img_answer); 
     reply = (ImageView) v.findViewById(R.id.imgReplay); 
     qText = (TextView) v.findViewById(R.id.txt_question); 
     aText = (TextView) v.findViewById(R.id.txt_answer); 

     aUserName = (TextView) v.findViewById(R.id.txt_a_user_name); 
     qUserName = (TextView) v.findViewById(R.id.txt_q_user_name); 
     layoutAnswer = (LinearLayout) v.findViewById(R.id.answer_box_item); 

    } 
    } 

    public static class ViewHolderUnsent extends RecyclerView.ViewHolder { 

    TextView unSentQuestion; 
    TextView unSentReplyText; 
    ImageView unSentImage; 

    public ViewHolderUnsent(View v) { 
     super(v); 

     unSentQuestion = (TextView) v.findViewById(R.id.txt_unSend_question); 
     unSentReplyText = (TextView) v.findViewById(R.id.txt_reply_unSend_question); 
     unSentImage = (ImageView) v.findViewById(R.id.img_unSend_question); 
    } 
    } 

    public static class ViewHolderReply extends RecyclerView.ViewHolder { 

    TextView replyPastQ; 
    TextView replyPastA; 
    TextView replyCurrentQ; 
    TextView replyCurrentA; 
    LinearLayout layoutAnswer; 
    ImageView imgReplay; 

    public ViewHolderReply(View v) { 
     super(v); 

     replyPastQ = (TextView) v.findViewById(R.id.reply_txt_past_question); 
     replyPastA = (TextView) v.findViewById(R.id.right_reply_txt_past_answer); 
     replyCurrentQ = (TextView) v.findViewById(R.id.reply_txt_current_question); 
     replyCurrentA = (TextView) v.findViewById(R.id.right_reply_txt_current_answer); 
     layoutAnswer = (LinearLayout) v.findViewById(R.id.answer_box_item); 
     imgReplay = (ImageView) v.findViewById(R.id.imgReplay); 

    } 
    } 


    @Override 
    public int getItemViewType(int position) { 

    /* *****************************Handling Inline Parents************** 
    * * 
    * 1 for item_message_no_file 
    * 2 for item_message_question_has_file 
    * 3 for item_message_answer_has_file 
    * 4 for item_message_q_a_has_file 
    * */ 
    if (chatArray.get(position).isNoFile()) { 
     return 1; 
    } else if (chatArray.get(position).isMineUnSend()) { 
     //UnSend 
     return 2; 
    } else if (chatArray.get(position).isReply()) { 
     //Has Reply 
     return 3; 
    } else if (chatArray.get(position).isqHasFile()) { 
     //At this position q has file 
     return 4; 
    } else if (chatArray.get(position).isaHasFile()) { 
     //At this position a has file 
     return 5; 
    } else { 
     //At this position q and a have file 
     return 6; 
    } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    // Create a new View 

    //No File 
    final View item_message_no_file = LayoutInflater.from(mContext).inflate(R.layout.item_message_no_file, parent, false); 

    //Not Send 
    final View item_message_un_send = LayoutInflater.from(mContext).inflate(R.layout.item_message_un_sent, parent, false); 

    //Reply 
    final View item_message_reply = LayoutInflater.from(mContext).inflate(R.layout.item_message_reply, parent, false); 

    //Question has File 
    final View item_message_q_has_file = LayoutInflater.from(mContext).inflate(R.layout.item_message_question_has_file, parent, false); 

    //Answers has File 
    final View item_message_a_has_file = LayoutInflater.from(mContext).inflate(R.layout.item_message_answer_has_file, parent, false); 

    //Question and Answer have file 
    final View item_message_q_a_has_file = LayoutInflater.from(mContext).inflate(R.layout.item_message_q_a_has_file, parent, false); 


    if (viewType == 1) { 
     return new ViewHolderNoFile(item_message_no_file); //For item_message_no_file 
    } else if (viewType == 2) { 
     return new ViewHolderUnsent(item_message_un_send); //For item_message_un_send 
    } else if (viewType == 3) { 
     return new ViewHolderReply(item_message_reply); //For item_message_reply 
    } else if (viewType == 4) { 
     return new ViewHolderQFile(item_message_q_has_file); //For item_message_q_has_file 
    } else if (viewType == 5) { 
     return new ViewHolderAFile(item_message_a_has_file); //For item_message_a_has_file 
    } else { 
     return new ViewHolderQAFile(item_message_q_a_has_file); //For item_message_q_a_has_file 
    } 
    } 

    /** 
    * add sent message to adapter 
    * 
    * @ArrayList<ChatModel> chatArray of messages 
    */ 

    public void addItem(ChatModel newMessage) { 

    Log.i("CHAT_ADAPTER", "CHAT ARRAY SIZE: " + this.chatArray.size()); 
    this.chatArray.add(newMessage); 
    //notifyItemInserted(this.chatArray.size()-1); 
    notifyDataSetChanged(); 
    } 


    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 

    String question; 
    CourseForumModel cfm = chatArray.get(holder.getAdapterPosition()).getCourseForumModel(); 

    switch (holder.getItemViewType()) { 

     case 1: //For item_message_no_file 

     ViewHolderNoFile vhNoFile = (ViewHolderNoFile) holder; 

     //Set userName of Answer 
     setUserName(vhNoFile.aUserName, cfm.getCourseForumAUserName()); 

     //Set userName of Question 
     setUserName(vhNoFile.qUserName, cfm.getCourseForumQUserName()); 

     //Set Question Text 
     setMessage(vhNoFile.qText, cfm.getCourseForumQuestion()); 

     //Set Answer Text 
     setMessage(vhNoFile.aText, cfm.getCourseForumAnswer()); 


     vhNoFile.reply.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      fragmentForum.onEvent(fragmentForum, chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumId()); 
      } 
     }); 

     // check if answer text is empty get answer layout gone 
     if (vhNoFile.aText.getText() == "") { 
      vhNoFile.layoutAnswer.setVisibility(View.INVISIBLE); 
     } else { 
      vhNoFile.layoutAnswer.setVisibility(View.VISIBLE); 
     } 

     break; 

     case 2: //For item_message_unSent 

     ViewHolderUnsent vhUnsent = (ViewHolderUnsent) holder; 

     SendChatModel unSendChat = chatArray.get(holder.getAdapterPosition()).getUnSendChats(); 

     question = unSendChat.getCourseForum().getCourseForumQuestion(); 

     int hasFile = unSendChat.getHasFile(); 

     if (unSendChat.getCourseForum().getCourseForumQuestion() != null) { 
      vhUnsent.unSentQuestion.setText(question); 
     } else { 
      vhUnsent.unSentQuestion.setText(""); 
     } 

     if (unSendChat.getCourseForum().getCourseForumReplyTo() > 0) { 
      vhUnsent.unSentReplyText.setText(unSendChat.getCourseForum().getReplyToSummary()); 
     } else { 
      vhUnsent.unSentReplyText.setText(""); 
     } 

     //This UnSend Message has a file 
     if (hasFile == 1) { 
      String filePath = chatArray.get(holder.getAdapterPosition()).getUnSendChats().getFilePath(); 

      Picasso 
      .with(mContext) 
      .load(new File(filePath)) 
      .resize(64, 64) 
      .into(vhUnsent.unSentImage); 
     } else { 
      vhUnsent.unSentImage.setImageResource(android.R.color.transparent); 
     } 

     break; 

     case 3: //For item_message_Reply 

     ViewHolderReply vRTReply = (ViewHolderReply) holder; 

     vRTReply.replyPastQ.setText(chatArray.get(holder.getAdapterPosition()).getReplayedMessage().getCourseForumQuestion()); 
     vRTReply.replyPastA.setText(chatArray.get(holder.getAdapterPosition()).getReplayedMessage().getCourseForumAnswer()); 
     vRTReply.replyCurrentQ.setText(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumQuestion()); 
     vRTReply.replyCurrentA.setText(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAnswer()); 

     vRTReply.imgReplay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      fragmentForum.onEvent(fragmentForum, chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumId()); 
      } 
     }); 

     // check if answer text is empty get answer layout gone 
     if (chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAnswer().equals("")) { 
      vRTReply.layoutAnswer.setVisibility(View.INVISIBLE); 
     } else { 
      vRTReply.layoutAnswer.setVisibility(View.VISIBLE); 
     } 

     break; 

     case 4: //For item_message_q_has_file 

     ViewHolderQFile vhQFile = (ViewHolderQFile) holder; 
     setUserName(vhQFile.qUserName, cfm.getCourseForumQUserName()); 
     setUserName(vhQFile.aUserName, cfm.getCourseForumAUserName()); 

     //Set Question Text 
     setMessage(vhQFile.qText, cfm.getCourseForumQuestion()); 

     //Set Answer Text 
     setMessage(vhQFile.aText, cfm.getCourseForumAnswer()); 

     loadImage(
      vhQFile.qImage, 
      holder.getAdapterPosition(), 
      chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumQFile() 
     ); 

     vhQFile.qImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      showDialog(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumQFile()); 

      } 
     }); 

     vhQFile.reply.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      fragmentForum.onEvent(fragmentForum, chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumId()); 
      } 
     }); 
     // check if answer text is empty get answer layout gone 
     if (vhQFile.aText.getText() == "") { 
      vhQFile.layoutAnswer.setVisibility(View.INVISIBLE); 
     } else { 
      vhQFile.layoutAnswer.setVisibility(View.VISIBLE); 
     } 

     break; 

     case 5: //For item_message_a_has_file 


     ViewHolderAFile vhAFile = (ViewHolderAFile) holder; 

     setUserName(vhAFile.qUserName, cfm.getCourseForumQUserName()); 
     setUserName(vhAFile.aUserName, cfm.getCourseForumAUserName()); 

     //Set Question Text 
     setMessage(vhAFile.qText, cfm.getCourseForumQuestion()); 

     //Set Answer Text 
     setMessage(vhAFile.aText, cfm.getCourseForumAnswer()); 

     loadImage(
      vhAFile.aImage, 
      holder.getAdapterPosition(), 
      chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAFile() 
     ); 

     vhAFile.aImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      showDialog(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAFile()); 

      } 
     }); 

     vhAFile.reply.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      fragmentForum.onEvent(fragmentForum, chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumId()); 
      } 
     }); 

     // check if answer text is empty get answer layout gone 

     if (vhAFile.aText.getText() == "") { 
      vhAFile.layoutAnswer.setVisibility(View.INVISIBLE); 
     } else { 
      vhAFile.layoutAnswer.setVisibility(View.VISIBLE); 
     } 

     break; 

     case 6: //For item_message_q_a_has_file 

     ViewHolderQAFile vhQAFile = (ViewHolderQAFile) holder; 

     setUserName(vhQAFile.qUserName, cfm.getCourseForumQUserName()); 
     setUserName(vhQAFile.aUserName, cfm.getCourseForumAUserName()); 

     //Set Question Text 
     setMessage(vhQAFile.qText, cfm.getCourseForumQuestion()); 

     //Set Answer Text 
     setMessage(vhQAFile.aText, cfm.getCourseForumAnswer()); 

     //Here Both Question and Answer have file 
     loadImage(
      vhQAFile.qImage, 
      holder.getAdapterPosition(), 
      chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumQFile() 
     ); 

     loadImage(
      vhQAFile.aImage, 
      holder.getAdapterPosition(), 
      chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAFile() 
     ); 

     vhQAFile.qImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      showDialog(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumQFile()); 

      } 
     }); 

     vhQAFile.aImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      showDialog(chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumAFile()); 

      } 
     }); 

     vhQAFile.reply.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      fragmentForum.onEvent(fragmentForum, chatArray.get(holder.getAdapterPosition()).getCourseForumModel().getCourseForumId()); 
      } 
     }); 

     // check if answer text is empty get answer layout gone 

     if (vhQAFile.aText.getText() == "") { 
      vhQAFile.layoutAnswer.setVisibility(View.INVISIBLE); 
     } else { 
      vhQAFile.layoutAnswer.setVisibility(View.VISIBLE); 
     } 

     break; 
    } 


    } 


    public void update(ArrayList<ChatModel> updatedArray) { 
    chatArray.clear(); 
    chatArray.addAll(updatedArray); 
    notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemCount() { 
    return chatArray.size(); 
    } 

    private void setUserName(TextView textView, String name) { 

    if (name.length() > 0) { 
     textView.setText(name); 
    } 
    } 

    private void setMessage(TextView textView, String text) { 

    if (text.length() > 0) { 
     textView.setText(text); 
    } 

    } 

    private void loadImage(final ImageView view, int position, final int fileId) { 

    FileModel fileModel = InternetService.getSingleFile(fileId); 
    String imageAddress = G.DIR_APP + fileModel.getFileName() + "." + fileModel.getFileExtension(); 
    Picasso 
     .with(mContext) 
     .load(new File(imageAddress)) 
     .resize(64, 64) 
     .into(view); 

    } 

    private void showDialog(int fileId) { 

    FileModel fileModel = InternetService.getSingleFile(fileId); 
    final Bitmap bitmap = BitmapFactory.decodeFile(G.DIR_APP + fileModel.getFileName() + "." + fileModel.getFileExtension()); 

    final Dialog dialog = new Dialog(mContext, R.style.CustomDialog); 
    dialog.setContentView(R.layout.activity_image_view); 
    ImageView img = (ImageView) dialog.findViewById(R.id.imgShow); 
    img.setImageBitmap(bitmap); 
    Button dismissButton = (Button) dialog.findViewById(R.id.dissbtn); 
    dismissButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     dialog.dismiss(); 
     } 
    }); 

    dialog.show(); 
    } 
} 

을 그리고 이것은 recyclerView의 이미지입니다 :

enter image description here

업데이트 :

내가에 위치의 로그인을 얻었다 onBindViewHolder 방법 Ans 아래에서 위로 스크롤 한 다음 logCat에서이 항목을 가져 왔습니다. 0-1-2-3-4-5-6-12-13-14-15-16-17! 항목 7-8-9-1-11 기록되지 않습니다!

이것은 나에게 정말로 중요합니다. 답변 해 주셔서 감사합니다.

+0

여기에있는 응답을 확인하십시오. https://stackoverflow.com/questions/28031875/recyclerview-adapter-taking-wrong-values ​​필드를 설정하기 전에 빈 체크를 추가하면 문제가 해결됩니다. (Ivan의 답변 확인). –

+0

나는 그것을했다. 그러나 그것은 나를 도와주지 않는다. – Ehsan

+0

변경 한 새 코드로 질문을 업데이트하십시오. –

답변

2

RecyclerView는 성능 향상을 위해 기존보기를 재사용합니다. 따라서 onBindViewHolder이 호출되고 이전 뷰가 새 값 및 스타일로 업데이트됩니다. 기존 값을 새 값으로 바꾸지 않으면 이전 값이 계속 표시됩니다.

RecyclerView

사용자가 목록을 스크롤하면 Android 지원 라이브러리가 이미 준비된보기 소유자를 표시하고 필요에 따라 새로운보기 소유자를 만들고 바인딩합니다. 그것은 눈에 보이지 않게 스크롤 한 뷰 홀더를 즉시 파괴하지 않습니다. 사용자가 뒤로 스크롤 할 경우 사용할 수 있도록 유지됩니다. 그러나 특정 수의보기 소유자가 만들어지면 Android Support Library가 새로운보기 소유자를 만들지 않습니다. 대신 은 필요에 따라 새 위치를 지정하기 위해 onBindViewHolder()를 호출하여 기존보기 홀더를 다시 바인딩합니다 (). 해당 방법 은 뷰 소유자의 콘텐츠를으로 업데이트하지만 은 해당 뷰 홀더에 대해 이미 생성 된 뷰을 다시 사용합니다. 이 메서드는 새로운 뷰를 구축하거나 팽창시키는 등의 값 비싼 액션을 수행 할 필요가 없습니다.

Amod Gokhale이 언급했다. 대부분의 경우, else 문이없는 if 문 때문에 잘못된보기가 나타납니다.

+0

고마워요.하지만 내 코드에 다른 것이 있으면 – Ehsan

1

내에서 상품을 검색하는 데 사용하는 모든 position에 대해 holder.getAdapterPosition()을 사용해야합니다.

P. 귀하의 질문과 관련이 없습니다. onCreateViewHolder에서는 모든 유형의 View을 먼저 팽창시킨 다음 viewType을 기반으로 필요한 유형 만 반환합니다. 먼저 viewType을 확인한 후 View 중 하나를 부풀려 야합니다.

+0

고마워요.하지만 holder.getAdapterPosition()으로 위치를 바꿨습니다. 그러나 나는 도움이되지 않습니다. – Ehsan

+0

getAdapterPosition()의 출력을 로그하고 목록을 스크롤하면 연속적으로 나타나나요? 0, 1, ..., n에서와 같이? –

+0

현재 사용중인 recyclerVIew에 18 가지 항목이 있습니다. 로그를 추가했는데 아래에서 위로 스크롤했을 때 출력됩니다. 17- 16 -15 -14 -13 - 12 -3 - 2 -1 - 0 항목 11-10-9 -8-7-6-5-4! – Ehsan

0

마침내 문제가 발견되었습니다. viewPager와 그 안에 3 개의 조각을 사용하고 있습니다. 언급 한 recyclerView가 포함 된 채팅 단편을 열고 위아래로 스크롤하면 모든 항목이 잘못된 위치에 저장됩니다! 그래서 @Ahmadul Hoq가 나에게 말했다시피, onBindViewHolder()에 항목 위치의 로그를 만들었습니다.그렇다면 항목이 연속적으로 연결되지 않을 것입니다.

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser){ 
    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisibleToUser){ 

     //Setting up recycler view for Chats 
     LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     rvMain.setLayoutManager(mLayoutManager); 

     mAdapter = new chatAdapter(populateCourseChats(), getActivity() , this); 
     rvMain.setAdapter(mAdapter); 
     scrollRecyclerToBottom(); //Scroll recyclerView to bottom 
    } 
    } 

그리고 이제 모든 것이 괜찮 :

마침내 나는이 문제는 사용자가이를 watch.Like하는 sweap 때 난 그냥 다시는 내 recyclerView을 설정하려면이 방법을 사용하는 조각과 viewPager.Then에 대해 알게되었다.

하지만이 문제가 발생하는 이유를 찾지 못했습니까?! 알고 계시면 알려주세요. 감사합니다.

관련 문제