我正在开发一个搜索联系人功能,在该屏幕中,NestedScrolView内部有一个RecyclerView(fillViewport = true)。屏幕设计:(此设计被客户接受,我无法更改) 将当前设备的所有联系人加载到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;
}
}
您正在使用RecyclerView错误。而不是将您的RecyclerView放在NestedScrollView中,将您的“Header”和“Search box”放在RecyclerView中作为不同的视图类型。
这个answer就是一个很好的例子。