gpt4 book ai didi

android - 在 NestedScrollView 中使用 RecyclerView 时性能不佳

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:22 25 4
gpt4 key购买 nike

我正在开发一个搜索联系人功能,在该屏幕中,NestedScrolView 中有一个 RecyclerView(fillViewport = true)。屏幕设计:(此设计已被客户接受,我无法更改)
enter image description here
将当前设备的所有联系人加载到一个ArrayList中后,从这个数组中筛选出搜索结果。
有几种情况会使应用程序非常滞后:
1. 当用户输入没有结果,然后用户清除搜索时,我必须再次显示所有结果NestedScrollView 必须为 RecyclerView 的所有项(例如:300 项)呈现 UI。
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 中,而是将“标题”和“搜索框”放在 RecyclerView 中作为不同的 View 类型。

answer就是一个很好的例子。

关于android - 在 NestedScrollView 中使用 RecyclerView 时性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com