在NestedScrollView中添加多个RecyclerView时,我遇到了性能问题。我在顶部显示两个水平的RecyclerView,在底部显示垂直的two。
我添加了下面的行
recyclerView.setNestedScrollingEnabled(false);这是正确地显示所有列表,但真正的问题是我面临着性能问题。
所有三个RecyclerView都在所有响应出现的大约5秒后显示。这也阻塞了UI,因为它正忙着让RecyclerView出现。
XML
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/llTabs"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.turacomobile.gb.utils.CustomSFUIMediumTextView
android:id="@+id/tvMyBrands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="My Streamz (Brands)"
android:textColor="@color/black" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rvMyBrands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="@dimen/dimen_5dp"
android:paddingRight="@dimen/dimen_5dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.turacomobile.gb.utils.CustomSFUIMediumTextView
android:id="@+id/tvRecommendedBrands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="Recommended Streamz (Brands)"
android:textAppearance="@style/TabLayoutTextStyleSearch"
android:textColor="@color/black" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rvRecommendedBrands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="@dimen/dimen_5dp"
android:paddingRight="@dimen/dimen_5dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.turacomobile.gb.utils.CustomSFUIMediumTextView
android:id="@+id/tvSearchMyStreamz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="Food from My Streamz Brands"
android:textColor="@color/black" />
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>JAVA
rvSearchStreamz = findViewById(R.id.my_recycler_view);
rvMyBrands = findViewById(R.id.rvMyBrands);
rvRecommendedBrands = findViewById(R.id.rvRecommendedBrands);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
rvSearchStreamz.setLayoutManager(llm);
rvSearchStreamz.setNestedScrollingEnabled(false);
rvSearchStreamz.setHasFixedSize(false);
LinearLayoutManager llmMy = new LinearLayoutManager(this);
llmMy.setOrientation(LinearLayoutManager.HORIZONTAL);
rvMyBrands.setLayoutManager(llmMy);
rvMyBrands.setNestedScrollingEnabled(false);
rvMyBrands.setHasFixedSize(false);
LinearLayoutManager llmRecommended = new LinearLayoutManager(this);
llmRecommended.setOrientation(LinearLayoutManager.HORIZONTAL);
rvRecommendedBrands.setLayoutManager(llmRecommended);
rvRecommendedBrands.setNestedScrollingEnabled(false);
rvRecommendedBrands.setHasFixedSize(false);发布于 2018-01-03 15:37:54
问题出在NestedScrollView上。您不应该在NestedScrollView中使用RecyclerView,因为RecyclerView不会回收NestedScrollView中的任何内容(您可以在onCreateView和onBindView中使用写日志进行测试)。更改容器布局类型,如LinearLayout、RelativeLayout等。
发布于 2018-01-03 15:32:08
首先更改适配器初始化
HorizontalAdapterOne hAdapterOne;
HorizontalAdapterTwo hAdapterTwo;并将其写入Activity中的onCreate方法中
hAdapterOne=new HorizontalAdapterOne(context,new ArrayList<DemoItemOne>);
hAdaptertwo=new HorizontalAdapterTwo(context,new ArrayList<DemoItemTwo>);在适配器中添加方法
public void refreshList(ArrayList<DemoModel> demoList){
if(demoList!=null && demoList.size()>0){
this.demoActualList.addAll(demoList);
notifyDataSetChanged();
}
}从API获取数据后,从您的活动中调用此方法
hAdapterOne.refreshList(demoListFromAPI)或者您可以使用自定义列表视图,而不是用于垂直列表的回收器视图。检查下面的列表视图类
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ListView;
public class ExpandableHeightListView extends ListView {
boolean expanded = true;
public ExpandableHeightListView(Context context) {
super(context);
}
public ExpandableHeightListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandableHeightListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public boolean isExpanded() {
return expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// HACK! TAKE THAT ANDROID!
if (isExpanded()) {
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
}发布于 2018-01-03 15:23:23
我建议您使用分页。就您关心的性能而言,这可以作为最好的催化剂。
在分页中,我们只将特定数量的内容下载并设置到recyclerview中。
阻塞的用户界面线程,并被大幅减少,也请与异步任务,如果你有大量的数据要渲染的用户界面,这是要保持尽可能轻
下面是链接,您可以在其中获得实现的想法。https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
https://stackoverflow.com/questions/48072775
复制相似问题