2

我正在开发一个搜索联系功能,在屏幕上,有一个RecyclerViewNestedScrolViewfillViewport =真)。 屏幕设计:这种设计是由顾客接受,我不能改变它
enter image description here
加载当前设备的所有接触到一个ArrayList之后,搜索结果被从该阵列过滤。
有几种情况,使应用程序非常laggy
1.当用户键入有没有结果的输入,然后用户清除搜索,我不得不再次显示所有结果。 NestedScrollView必须为RecyclerView(例如:300项)的所有项呈现UI。
2.当结果数量有很多变化时(例如,从1到300个项目)。 NestedScrollView有渲染UI进行了大量的项目RecyclerView
糟糕的表现时使用RecyclerView内NestedScrollView

我知道这个设计打破循环RecyclerView的技术,但我不能改变它。
我试了一下:

recyclerView.setNestedScrollingEnabled(false); 

在AndroidManifest:

android:windowSoftInputMode="adjustNothing" 

适配器:

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

发布您的recyler适配器 –

+0

你能解释一下你的ui设计吗?这部分是可滚动的?即你可以滚动nestedscrollview和recyclerview内nestedscrollview或什么? – Okas

+0

@Okas除了工具栏,用户可以滚动整个屏幕 –

回答

2

您正确使用RecyclerView。不要将RecyclerView放入NestedScrollView,而是将RecyclerView中的“Header”和“Search box”作为不同的视图类型。

answer就是一个很好的例子。

+0

这种方法听起来合适,但会有4种不同的视图类型:标题(TextView),按钮,搜索框,普通项目,处理每个事件时都很复杂。 –

+0

起初看起来很复杂。其实这是标准做法。同样看着你的UI,看起来你可以把你的标题,按钮和搜索框放在一个布局中,所以它只会是两种视图类型。 – Okas

+0

哦,我明白了,我希望我能告诉你确切的屏幕设计。我会尝试你的解决方案 –