在NestedScrollView中使用RecyclerView时性能不佳

问题描述 投票:5回答:1

我正在开发一个搜索联系人功能,在该屏幕中,NestedScrolView内部有一个RecyclerView(fillViewport = true)。屏幕设计:(此设计被客户接受,我无法更改) enter image description here 将当前设备的所有联系人加载到ArrayList后,将从此阵列中过滤搜索结果。 有几种情况使应用程序非常滞后: 1.当用户输入没有结果的输入时,用户清除搜索,我必须再次显示所有结果。 NestedScrollView必须为RecyclerView的所有项目呈现UI(例如:300个项目)。 2.当结果数量有很多变化时(例如,1到300个项目)。 NestedScrollView必须为RecyclerView的许多项目呈现UI

我知道这个设计打破了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;
    }

}
android performance android-recyclerview android-nestedscrollview
1个回答
7
投票

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

这个answer就是一个很好的例子。

© www.soinside.com 2019 - 2024. All rights reserved.