我有一个大约5-6行的ListView,每一行都是一个显示水平片段的RecycleView。卡片(比如Netflix,家庭影院应用)
考虑因素:
我在SparseArray适配器中为RecycleViews创建了一个缓存( ListView ),以保持每个RecycleView的状态,否则每次离开屏幕时都会重新启动到0。
通过这样做,只要将每个RecycleView滚动到最后,它们中的一些就会被冻结。
尝试了几种解决办法:
但是,所有这些选项都没有起作用,确保应用程序不被冻结的唯一方法是避免ListView缓存(如果将视图移出屏幕,则失去您访问的最后一个位置)。
滑动代码(我在这里尝试了几种选择:避免位图、避免内存缓存、向所有人更新磁盘策略)
Glide.with(context).load(url)
.asBitmap()
.skipMemoryCache(true)
.thumbnail(0.5f)
.centerCrop()
.error(placeHolderId)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
//.priority(Priority.NORMAL)
.dontAnimate()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
if (bitmap != null) {
imgView.setImageBitmap(bitmap);
//cache.put(url, bitmap);
} else {
imgView.setBackground(null);
}
}
});有什么建议吗?也许还有另一种选择来保持视图的状态而不需要缓存?
ListView适配器代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
case TYPE_VENUE_FILTER: {
View v;
// Create a new view into the list.
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (inflater != null) {
v = inflater.inflate(R.layout.fragment_venue_filter, parent, false);
}
// We need to get the exact filter to be displayed
int index = position - FIRST_VENUE_FILTER_ROW;
if (index < this.filters.size()) {
VenueFilter filter = this.filters.get(index);
// Recalculate the distance order
filter.sortVenuesForLocation(this.lastLocation);
// Set data into the view.
VenueFilterFragment.loadFragment(this.context, v, filter, this.fm);
}
return v;
}
}更新11/04
我终于明白了。
此代码位于适配器中,用于膨胀特定行(getView)。
// We should reset or recover the scroll state
LinearLayoutManager llm = (LinearLayoutManager) filterContent.getLayoutManager();
if (filter.offset > 0) {
if (llm != null) llm.scrollToPosition(filter.offset + 1);
} else {
if (llm != null) llm.scrollToPosition(0);
}
// We need to clear every time. Because we are reusing the view
recycleView.clearOnScrollListeners();
// We need to create a new specific scroll listener
recycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// Keeping the offset for a future load
LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager();
if (llm != null) filter.offset = llm.findFirstVisibleItemPosition();
}
});发布于 2018-04-10 10:43:26
这是一个非常广泛和复杂的问题。您的布局很复杂,因此需要付出一定的努力才能使其高效。你可以做些什么来提高你的表现:
RecyclerView应该在可能的情况下使用视图持有人。如果需要,请定义多个视图类型。父RecyclerView可能只有一种视图类型,即带有子RecyclerView的项。子RecyclerView也可以通过拥有一个RecycledViewPool来共享视图持有者。更多信息在这里:https://developer.android.com/reference/android/support/v7/widget/RecyclerView.RecycledViewPool.htmlImageView状态。我希望这能帮上忙。祝好运!
https://stackoverflow.com/questions/49751175
复制相似问题