RecyclerView 项目中的 RecyclerView
RecyclerView in a RecyclerView item
我知道这是个坏主意,但我在另一个 RecyclerView 的项目中使用 RecyclerView 来显示包含列表的项目列表。
我设法让它工作并尽可能地调整它,但是当包含更多项目的列表开始显示并在屏幕上绘制时,我仍然会遇到 green
尖峰。
这些尖峰在快速浏览物品时会产生明显的延迟,而在使用比三星 Galaxy S6 更慢更旧的设备时会更加明显。
我做了一些日志记录,看来 outer
ViewHolders 正在被回收,而 inner
RecyclerView 的适配器只创建了 5 次,所以一定是绘图时间导致了性能下降。
我设法通过设置 RecycledViewPool 中 ViewHolder 的最大数量来限制新 inner
RecyclerView 的 ViewHolder 的创建,但这帮助不大。
我知道内部 RecyclerView 没有 "bottom" 可以依赖它来计算何时显示新项目,因此它必须立即绘制每个项目,这可能是其中一个的主要原因不应使用此设置。 (我在写这个问题的时候回过神来..谢谢世界上的橡皮鸭)。
有什么方法可以进一步调整它,或者您能否建议如何在另一个 RecyclerView 的项目中使用 RecyclerView 以外的其他设置来完成这项工作?
如果需要,我会提供更多信息。
谢谢
最好的解决方案是切换回 ListView
并使用 ExpandableListView
interface,或者自己在 RecyclerView
.[=15= 上实现它]
正如您所提到的 - 列出滚动组件从来都不是一个好的解决方案。这是一个示例可扩展列表视图适配器,因此您知道需要什么:
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
...
@Override
public Object getChild(int listPosition, int childListPosition) {
//return an item that would have been in one of the nested recyclers
//(listPosition = parent, childListPosition = nested item number)
return getGroup(listPosition).getChildren().get(childListPosition);
}
@Override
public int getChildrenCount(int listPosition) {
//presuming the parent items contain the children
return getGroup(listPosition).getChildren().size();
}
@Override
public Object getGroup(int listPosition) {
//group is the parent items (the tope level recycler view items)
return mData.get(listPosition);
}
@Override
public int getGroupCount() {
return mData.size();
}
@Override
public View getGroupView(int listPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
}
MyDataType item = getGroup(listPosition);
//set the fields (or better yet, use viewholder pattern)
return convertView;
}
@Override
public View getChildView(int listPosition, final int expandedListPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
}
MyDataType item = getChild(listPosition, expandedListPosition);
//set the fields (or better yet, use viewholder pattern)
return convertView;
}
}
我通过创建共享 RecycledViewPool
获得了更好的性能,正如在评论中链接的@Raghunandan 项目中所做的那样。
Google I/O Android App - Shared RecycledViewsPool
我还为该池设置了最大视图数,这确实起到了作用,现在我只需要找到一种方法来重用我的听众并避免创建新的听众,但这是一个不同的问题。
谢谢大家的回复。
以后有什么好用的我再post
我知道这是个坏主意,但我在另一个 RecyclerView 的项目中使用 RecyclerView 来显示包含列表的项目列表。
我设法让它工作并尽可能地调整它,但是当包含更多项目的列表开始显示并在屏幕上绘制时,我仍然会遇到 green
尖峰。
这些尖峰在快速浏览物品时会产生明显的延迟,而在使用比三星 Galaxy S6 更慢更旧的设备时会更加明显。
我做了一些日志记录,看来 outer
ViewHolders 正在被回收,而 inner
RecyclerView 的适配器只创建了 5 次,所以一定是绘图时间导致了性能下降。
我设法通过设置 RecycledViewPool 中 ViewHolder 的最大数量来限制新 inner
RecyclerView 的 ViewHolder 的创建,但这帮助不大。
我知道内部 RecyclerView 没有 "bottom" 可以依赖它来计算何时显示新项目,因此它必须立即绘制每个项目,这可能是其中一个的主要原因不应使用此设置。 (我在写这个问题的时候回过神来..谢谢世界上的橡皮鸭)。
有什么方法可以进一步调整它,或者您能否建议如何在另一个 RecyclerView 的项目中使用 RecyclerView 以外的其他设置来完成这项工作?
如果需要,我会提供更多信息。
谢谢
最好的解决方案是切换回 ListView
并使用 ExpandableListView
interface,或者自己在 RecyclerView
.[=15= 上实现它]
正如您所提到的 - 列出滚动组件从来都不是一个好的解决方案。这是一个示例可扩展列表视图适配器,因此您知道需要什么:
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
...
@Override
public Object getChild(int listPosition, int childListPosition) {
//return an item that would have been in one of the nested recyclers
//(listPosition = parent, childListPosition = nested item number)
return getGroup(listPosition).getChildren().get(childListPosition);
}
@Override
public int getChildrenCount(int listPosition) {
//presuming the parent items contain the children
return getGroup(listPosition).getChildren().size();
}
@Override
public Object getGroup(int listPosition) {
//group is the parent items (the tope level recycler view items)
return mData.get(listPosition);
}
@Override
public int getGroupCount() {
return mData.size();
}
@Override
public View getGroupView(int listPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
}
MyDataType item = getGroup(listPosition);
//set the fields (or better yet, use viewholder pattern)
return convertView;
}
@Override
public View getChildView(int listPosition, final int expandedListPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
}
MyDataType item = getChild(listPosition, expandedListPosition);
//set the fields (or better yet, use viewholder pattern)
return convertView;
}
}
我通过创建共享 RecycledViewPool
获得了更好的性能,正如在评论中链接的@Raghunandan 项目中所做的那样。
Google I/O Android App - Shared RecycledViewsPool
我还为该池设置了最大视图数,这确实起到了作用,现在我只需要找到一种方法来重用我的听众并避免创建新的听众,但这是一个不同的问题。
谢谢大家的回复。 以后有什么好用的我再post