MAY*_*3AM 6 android android-recyclerview android-collapsingtoolbarlayout android-appbarlayout nestedscrollview
好吧,我之前尝试过的一些方法:
1.使用CollapsingToolbarLayout
我把我CardView的insid CollapsingToolbarLayout并把他们都在AppBarLAyout.
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|exitUntilCollapsed" >
<CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<!-- My Views Goes there -->
</CardView
<android.support.v7.widget.Toolbar
android:id="@+id/flexible.example.toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@null"
app:layout_collapseMode="pin"
style="@style/ToolBarWithNavigationBack"
/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<RecyclerView
app:layout_behavior="@string/appbar_scrolling_view_behavior"
></RecyclerView>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
PS:我删除了不相关的代码,不提我
这种方式正常但是!!! 当CardView高度高于屏幕高度时,它的内容由AppBarLayout用户显示并且不向用户显示
2.使用NestedScrollView
我放入CardView和RecyclerView内部NestedScrollView.但问题是当用户到达时回收到RecyclerView,然后滚动回到顶部,fling会变得迟钝和错误并停止一些用户必须滚动越来越多的地方!
<android.support.v4.widget.NestedScrollView
android:id="@+id/nested_scrollbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:scrollbars="none" >
<LinearLayout
android:id="@+id/nested_scrollbar_linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<android.support.v7.widget.CardView
android:id="@+id/flexible.example.cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/post_card_backgroind"
app:cardCornerRadius="0dp"
app:cardElevation="0dp">
</android.support.v7.widget.CardView>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/four"
android:layout_marginEnd="@dimen/four"
android:layout_marginLeft="@dimen/four"
android:layout_marginRight="@dimen/four"
android:layout_marginStart="@dimen/four"
android:layout_marginTop="@dimen/four"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?!我不想使用为recyclelerview制作标题的适配器,我从其中一些获得了与性能相关的问题.
回答
如你在2中看到的那样放入RecyclerView内部并应用并设置为NestedScrollView.setNestedScrollingEnabledfalse
你应该使用getItemViewType.它很容易,不会产生任何性能开销.改变你Adapter喜欢这样的代码:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class CardViewHolder extends RecyclerView.ViewHolder {
...
}
class ItemViewHolder extends RecyclerView.ViewHolder {
...
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return 0; // Card Type
} else {
return 1; // Item Type
};
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0:
// Card Type
return new CardViewHolder(...);
case 1:
// Item Type
return new ItemViewHolder(...);
}
}
// Optional
// If your data list does not contain CardView data
// You may need to add extra count in adapter
@Override
public final int getItemCount() {
// Add one count for CardView data
return list.size() + 1;
}
@Override
public T getItem(int position) {
// As the position is change because of CardView at position 0
// So you may have to decrement the corresponding index
return list.get(position - 1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不想更新适配器,则可以使用
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Views Goes there -->
</CardView>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
// This is the key
android:nestedScrollingEnabled="false"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)
android:nestedScrollingEnabled可在API Level 21到xml中使用.
对于较低的API,使用java方法ie recyclerView.setNestedScrollingEnabled(false);或ViewCompat.setNestedScrollingEnabled(recyclerView, false);
注意(12-12-2016)
使用嵌套滚动时.请注意RecyclerView的已知问题,不要回收此处和此处的回收视图(分别由Arpit Ratan和我回答).所以我建议使用第一个解决方案,即使用getItemViewType.有关详细信息,请参阅此类或此类的完整和更好的答案.
您可以使用setFullSpan.如果您的方向StaggeredGridLayoutManager是垂直的,您可以使用以下代码将其宽度跨越到全屏:
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (position == 0) {
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
layoutParams.setFullSpan(true);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6586 次 |
| 最近记录: |