我正在查看GridLayoutManager的文档及其RecyclerView的SpanSizeLookUp类.但我无法了解SpanSizeLookUp类的getSpanGroupIndex和getSpanIndex方法.我还通过覆盖和返回任意数字(小于跨度计数)进行实验.但我不知道它用于什么.
我无法理解文档说明.我想清楚这一点.
我必须创建一个异构的RecyclerView.默认列数为2,但某些项目需要全宽.我这样使用它StaggeredGridLayoutManager是这样的:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
FeedItems currentItem = getItem(position);
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
switch (viewType) {
case ITEM_TYPE_HEADER:
final HeaderItem headerItem = currentItem.getHeaderItem();
layoutParams.setFullSpan(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何为GridLayoutManager做同样的事情,我可以根据不同的视图类型轻松切换范围?
我正在尝试使用RecyclerView和GridLayoutManager来显示项目列表。
这是我要满足的条件:
spanCount我发现如果android:layout_width="match_parent"在项目视图上进行设置,则项目宽度将通过用RecyclerView的宽度除以来设置spanCount。
问题是我不知道使项目高度与布局管理器确定的宽度成正比。
我唯一的解决方案是放弃布局管理器进行度量,并在中明确设置项目尺寸onBindViewHolder:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
ViewGroup.LayoutParams p = v.getLayoutParams();
p.width = parent.getWidth() / mLayoutManager.getSpanCount();
p.height = p.width * 3/2;
v.setLayoutParams(p);
return new MyViewHolder(v);
}
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何能帮助我改善解决方案的指针。
我正在使用以下代码动态更改跨度计数。
val layoutManager = GridLayoutManager(this, 3)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
when (position) {
0, 1, 2 -> return 1
3, 4 -> return 2
5 -> return 3
else -> return 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了以下输出。但是我希望D和E在水平方向上对齐。我不怎么做。
实际上,我在适配器中有3种类型:HEADER,TYPE_A,TYPE_B。 HEADER应该只有一行,TYPE_A是3行,TYPE_B是2行。
因此,请允许我获得帮助,以使某些列应具有1个1行,而某些列仅具有2行(水平均等对齐),而另一些则具有3行。
我正在用 gridlayoutManager 填充 recyclerView。现在我想在屏幕旋转上保存滚动位置。
我尝试使用 onSaveInstanceState 和 onRestoreInstanceState() 这样做,如本文所示:
如何使用 RecyclerView.State 保存 RecyclerView 的滚动位置?
下面是我的代码:
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.e(TAG, "onSaveInstanceState");
super.onSaveInstanceState(outState);
outState.putParcelable(KEY_INSTANCE_STATE_RV_POSITION,
gridLayoutManager.onSaveInstanceState());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.e(TAG, "onRestoreInstanceState");
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState!= null){
Parcelable savedState =
savedInstanceState.getParcelable(KEY_INSTANCE_STATE_RV_POSITION);
movieAdapter.addAll(movieItemList);
if (savedState!= null){
gridLayoutManager.onRestoreInstanceState(savedState);
}
}
}
//this is my movieAdapter.addAll() method
public void addAll(List<MovieItem>items){
movieItems = items;
}
//This is the method to get lists of movies from ViewModel Class
private void loadFavMovies() {
FavViewModel …Run Code Online (Sandbox Code Playgroud) 我使用 RecyclerView 和 GridLayoutManager 作为巴士票预订的布局。一切正常,但除了我坚持使用逻辑的地方,我必须使用这些逻辑在所有行中的 3 和 4 列项目之间留出更多间距。基本上我的布局应该像下面所附的屏幕截图。
我的要求:
电流输出:
我还发布了我完整的 RecyclerView GridLayoutManager 供您参考,如下所示
MultiSelectRecyclerViewAdapter.java
public class MultiSelectRecyclerViewAdapter extends SelectableAdapter<MultiSelectRecyclerViewAdapter.ViewHolder> {
private ArrayList<String> mArrayList;
private Context mContext;
private ViewHolder.ClickListener clickListener;
public MultiSelectRecyclerViewAdapter (Context context, ArrayList<String> arrayList,ViewHolder.ClickListener clickListener) {
this.mArrayList = arrayList;
this.mContext = context;
this.clickListener = clickListener;
}
// Create new views
@Override
public MultiSelectRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.row_multiselect, null);
ViewHolder viewHolder = new ViewHolder(itemLayoutView,clickListener);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, …Run Code Online (Sandbox Code Playgroud) android android-custom-view gridlayoutmanager android-recyclerview
我正在尝试使用GridLayoutManager构建RecyclerView,该GridLayoutManager每行具有可变的列数,如下所示:
同一行中所有项目的宽度总和将始终为屏幕宽度。
我试图重新组织项目列表,将它们按行列表分组,然后每行增加一个LinearLayout。效果不佳。
所以我被困住了,没有想法。任何帮助将非常感激
如何创建偶数行 3 列和奇数行 4 列的 Grid Recyclerview?
lLayout = new GridLayoutManager(getActivity(), 4, LinearLayoutManager.VERTICAL, false); // MAX NUMBER OF SPACES
lLayout.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return (position % 3 == 0 ? 3 : 4);
}
});
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(lLayout);
if (arrayList != null) {
adapter = new RecyclerViewAdapter(getActivity(), arrayList);
recyclerView.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud) android android-gridlayout gridlayoutmanager android-recyclerview
我正在使用 RecyclerView 在网格布局中显示项目。下面是模拟器的图像和我需要实现的期望结果。左侧(执行)图像是我的模拟器上的输出,而右侧(所需)是我想要实现的输出。
活动布局 XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d3c3c3">
<include
android:id="@+id/toolBarIncluded"
layout="@layout/toolbar_new_layout" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolBarIncluded"
android:orientation="vertical"
android:weightSum="1">
<RelativeLayout
android:id="@+id/recyclerAdView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="0.65"
android:background="#009688" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/recyclerAdView"
android:layout_gravity="center"
android:layout_weight="0.35"
android:background="#00000000"
android:gravity="center">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerGridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="2dp"
android:background="#00000000"
android:foregroundGravity="center" />
</RelativeLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
列表项 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llGridItemLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="6dp"
android:background="@drawable/drawable_grid_item_background"
android:gravity="center"
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:orientation="vertical">
<ImageView
android:id="@+id/ivItemIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:src="@drawable/ic_new_receipt_wrong" />
<TextView
android:layout_marginTop="6dp"
android:id="@+id/tvItemName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1" …Run Code Online (Sandbox Code Playgroud) android grid-layout gridlayoutmanager android-recyclerview recyclerview-layout
我有一个带有 GridLayoutManager 作为布局管理器的 recyclerview,我想要实现的效果如下图所示
正如您所看到的,每行可能有多个项目,仅基于项目宽度,每个项目都是一个具有wrap_content宽度的 TextView,但所有项目都具有相同的高度。
我知道可以设置行跨度,SpanSizeLookup但为此,我应该知道之前的跨度计数,而我的列表行将仅按项目宽度填充
有人可以帮助我吗?