2

안에 내가 검색 연락처 기능을 개발하고있을 때, 해당 화면에서 (사실 fillViewport =) NestedScrolView 내부 RecyclerView있다. 화면 디자인 : ArrayList에로 현재 장치의 모든 연락처를 넣은 후
enter image description here
(이 디자인은 고객에 의해 받아 들여, 내가을 변경할 수 없습니다), 검색 결과가이 배열에서 필터링됩니다. 사용자가 어떤 결과이없는 입력을 입력하면
1. 다음 사용자 명확 검색, 내가 다시 모든 결과를 보여주고 있습니다
는 매우 랙이 응용 프로그램을 구성하는 여러 가지 경우가있다. NestedScrollViewRecyclerView (예 : 300 개 항목)의 모든 항목에 대해 UI를 렌더링해야합니다.
2. 결과 수가 많은 경우 (예 : 1 ~ 300 항목). NestedScrollViewRecyclerView 내가 RecyclerView의 기술을 재활용이 디자인 휴식을 알고
나쁜 성능은 사용 RecyclerView이 NestedScrollView

의 많은 항목에 대한 UI를 렌더링 할 수있다,하지만 난 그것을 변경할 수 없습니다. 내가 뭘하려
:

recyclerView.setNestedScrollingEnabled(false); 

AndroidManifest를에서 :

android:windowSoftInputMode="adjustNothing" 

어댑터 : 당신은 잘못 RecyclerView를 사용하는

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

    private List<MobileContact> contacts; 
    private Context context; 

    public RecyclerContactAdapter() { 
     contacts = new ArrayList<>(); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     this.context = parent.getContext(); 
     View view = LayoutInflater.from(context) 
       .inflate(R.layout.item_recycler_contact, parent, false); 

     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     //set data for view 
    } 

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

    protected class ViewHolder extends RecyclerView.ViewHolder { 
     private TextView tvAlphabetHeader; 
     private CircleImageView civAvatar; 
     private TextView tvContactName; 
     private TextView tvStatus; 
     private CheckBox cbInvited; 
     private RelativeLayout rlAlphabetHeader; 
     private RelativeLayout rlContainer; 

     protected ViewHolder(View itemView) { 
      super(itemView); 
      tvAlphabetHeader = itemView.findViewById(R.id.item_recycler_contact_tv_alphabet_header); 
      civAvatar = itemView.findViewById(R.id.item_recycler_contact_civ_avatar); 
      tvContactName = itemView.findViewById(R.id.item_recycler_contact_tv_name); 
      tvStatus = itemView.findViewById(R.id.item_recycler_contact_tv_status); 
      cbInvited = itemView.findViewById(R.id.item_recycler_contact_cb_contact); 
      rlAlphabetHeader = itemView.findViewById(R.id.item_recycler_contact_rl_alphabet); 
      rlContainer = itemView.findViewById(R.id.item_recycler_contact_rl_contact); 
     } 
    } 

    public void addAll(List<MobileContact> mobileContacts) { 
     this.contacts.clear(); 
     this.contacts.addAll(mobileContacts); 
     notifyDataSetChanged(); 
    } 

    public void add(MobileContact mobileContact) { 
     this.contacts.add(mobileContact); 
    } 

    public List<MobileContact> getContacts() { 
     return this.contacts; 
    } 

} 
+0

리필러 어댑터 게시 –

+0

UI 디자인을 좀 더 설명해 주시겠습니까? 이것의 어느 부분이 스크롤 가능합니까? 즉, nestedscrollview 또는 nestedscrollview 내부의 recyclerview를 스크롤 할 수 있습니까? – Okas

+0

@Okas 도구 모음을 제외하고 사용자가 전체 화면을 스크롤 할 수 있습니다. –

답변

2

. RecyclerView를 NestedScrollView에 배치하는 대신 RecyclerView에 "헤더"와 "검색 상자"를 다른 뷰 유형으로 배치하십시오.

answer은 좋은 예입니다.

+0

이 방법은 적절하지만 4 가지보기 유형 (헤더 (텍스트보기), 버튼, 검색 상자, 일반 항목, 각각의 모든 이벤트를 처리 할 때 복잡합니다. –

+0

처음에는 복잡해 보입니다. 사실 이것은 표준 관행입니다. 또한 UI를 보면 머리글, 단추 및 검색 상자를 하나의 레이아웃에 넣을 수 있으므로 두 가지보기 유형이 될 것입니다. – Okas

+0

오, 알겠지만, 나는 당신에게 정확한 화면 디자인을 보여줄 수 있었으면 좋겠다. 당신의 해결책을 시도 할 것입니다 –