在我的应用程序中,我使用tabHost Activiy。在tabhost第一个标签中,我使用TabActivity,我加载了超过500个图像。
使用嵌套的SCroll视图:
我在recyclerview中使用了嵌套滚动视图。当加载主页时,它最初加载所有500个图像,然后显示主页。因此它会导致内存错误。
不使用嵌套的SCroll视图:
如果我删除嵌套滚动视图,一切都运行良好。滚动时逐个加载图像。它不会导致内存不足错误。
我的要求:
我需要滚动放置在recyclerview顶部的相对布局。所以我使用嵌套滚动视图。但它对我没用。
tab_home_layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<LinearLayout
android:id="@+id/tab_home_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<RelativeLayout
android:id="@+id/home_layout_top_2_recycler"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/layout_border"
>
<ImageView
android:id="@+id/img_user_home_tab_recycler"
android:layout_width="40dp"
android:layout_height="40dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_centerVertical="true"
android:contentDescription="@string/cont_desc"
android:src="@drawable/profile_pic_blue" />
<TextView
android:id="@+id/tv_user_mind_home_tab_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/img_user_home_tab_recycler"
android:hint="@string/whats_on"
android:textColor="@color/Black"
android:textSize="@dimen/txt_size" />
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list_tab_home_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:visibility="visible" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
下面我愿意分享我到目前为止所尝试的内容。
我试过这个SO Post。但是 我在tabActivity中使用主页。所以我不能使用工具栏+ 协调员布局。所以this solution没有工作 对我来说。
然后我尝试使用multiple layout 对于recyclerview.But这对我没用。因为那样 relativelayout是一个静态的。如果我得到任何条件 webservice意味着,我可以使用多个布局recyclerview.But我需要 只是滚动视图。
我打算在第0个位置设置静态relativelayout adapter.But我的webservices图像从第0位加载。所以我 无法在适配器的第0位设置静态relativelayout。
是否有任何替代方案可以解决这个问题。谢谢。
答案 0 :(得分:13)
您可以在任何您喜欢的地方使用CoordinatorLayout
,与LinearLayout
甚至RelativeLayout
等其他布局类似。如果您希望RelativeLayout
滚动以回复RecyclerView
,只需将其放入CoordinatorLayout
AppBarLayout
内。这是您修改的布局:
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/home_layout_top_2_recycler"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/layout_border"
app:layout_scrollFlags="scroll">
<ImageView
android:id="@+id/img_user_home_tab_recycler"
android:layout_width="40dp"
android:layout_height="40dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_centerVertical="true"
android:contentDescription="@string/cont_desc"
android:src="@drawable/profile_pic_blue" />
<TextView
android:id="@+id/tv_user_mind_home_tab_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/img_user_home_tab_recycler"
android:hint="@string/whats_on"
android:textColor="@color/Black"
android:textSize="@dimen/txt_size" />
</RelativeLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list_tab_home_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:visibility="visible"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
将其更改为您的偏好,但请务必将layout_height
的{{1}}设置为RelativeLayout
以外的其他内容。
如果此wrap_content
位于另一个CoordinatorLayout
内,请使用此answer中的CoordinatorLayout
作为内部NestedCoordinatorLayout
。
答案 1 :(得分:5)
重要的是onBindViewHolder
您应该从 position-1 加载来自您的网络服务的图片。
这是here的示例,在您的情况下,Header
是您的静态RelativeLayout
public class HeaderAdapter extends RecyclerView.Adapter < RecyclerView.ViewHolder > {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
String[] data;
public HeaderAdapter(String[] data) {
this.data = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
//inflate your layout and pass it to view holder
return new VHItem(null);
} else if (viewType == TYPE_HEADER) {
//inflate your layout and pass it to view holder
return new VHHeader(null);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof VHItem) {
String dataItem = getItem(position);
//cast holder to VHItem and set data
// ***********
// LOAD YOUR WEBSERVICE IMAGE FROM **position - 1**
// => for row 1 you will get the image 0 ...
// ***********
} else if (holder instanceof VHHeader) {
//cast holder to VHHeader and set data for header.
}
}
//increasing getItemcount to 1. This will be the row of header.
@Override
public int getItemCount() {
return data.length + 1;
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position))
return TYPE_HEADER;
return TYPE_ITEM;
}
// condition for header
private boolean isPositionHeader(int position) {
return position == 0;
}
// getItem -1 because we have add 1 header
private String getItem(int position) {
return data[position - 1];
}
class VHItem extends RecyclerView.ViewHolder {
TextView title;
public VHItem(View itemView) {
super(itemView);
}
}
class VHHeader extends RecyclerView.ViewHolder {
Button button;
public VHHeader(View itemView) {
super(itemView);
}
}
}