繁体   English   中英

如何将回收站视图项目自动调整到屏幕 android 的宽度?

[英]How to auto fit recyclerview items to the width of screen android?

我正在尝试实现以下布局。 我想以占据整个屏幕宽度的方式放置项目:

预期布局: 在此处输入图片说明

实际布局:

在此处输入图片说明

这是我的 Recyclerview 项目的代码:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools">

  <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/size_8dp"
    android:paddingStart="@dimen/size_20dp"
    android:paddingEnd="@dimen/size_20dp"
    android:paddingBottom="@dimen/size_8dp">

    <ImageView
      android:id="@+id/legendsItemIcon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintBottom_toTopOf="@+id/text_legend_status_name"
      />
    <TextView
      android:id="@+id/text_legend_status_name"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      tools:text="Low"
      android:textSize="@dimen/text_size_8sp"
      app:layout_constraintTop_toBottomOf="@+id/legendsItemIcon"
      app:layout_constraintStart_toStartOf="@+id/legendsItemIcon"
      app:layout_constraintEnd_toEndOf="@+id/legendsItemIcon"
      app:layout_constraintBottom_toBottomOf="parent"
      android:textColor="@color/legends_item_status_text_color"
      android:layout_marginTop="@dimen/size_4dp"
      />

  </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

我怎样才能做到这一点?

这个自定义类将帮助您https://gist.github.com/heinrichreimer/39f9d2f9023a184d96f8

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.ViewGroup;

public class SpanningLinearLayoutManager extends LinearLayoutManager {

public SpanningLinearLayoutManager(Context context) {
    super(context);
}

public SpanningLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

public SpanningLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
    return spanLayoutSize(super.generateDefaultLayoutParams());
}

@Override
public RecyclerView.LayoutParams generateLayoutParams(Context c, AttributeSet attrs) {
    return spanLayoutSize(super.generateLayoutParams(c, attrs));
}

@Override
public RecyclerView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
    return spanLayoutSize(super.generateLayoutParams(lp));
}

@Override
public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
    return super.checkLayoutParams(lp);
}

private RecyclerView.LayoutParams spanLayoutSize(RecyclerView.LayoutParams layoutParams){
    if(getOrientation() == HORIZONTAL){
        layoutParams.width = (int) Math.round(getHorizontalSpace() / (double) getItemCount());
    }
    else if(getOrientation() == VERTICAL){
        layoutParams.height = (int) Math.round(getVerticalSpace() /  (double) getItemCount());
    }
    return layoutParams;
}

@Override
public boolean canScrollVertically() {
    return false;
}
@Override
public boolean canScrollHorizontally() {
    return false;
}

private int getHorizontalSpace() {
    return getWidth() - getPaddingRight() - getPaddingLeft();
}

private int getVerticalSpace() {
    return getHeight() - getPaddingBottom() - getPaddingTop();
}
}

将 RecyclerView layoutManager 设置为 SpanningLinearLayoutManager 而不是 LinearLayoutManager

如果我理解正确,你需要一个水平回收器视图..所以设置你的布局管理器如下:

    LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
    recyclerView.setLayoutManager(mHorizontalLayoutManager);

如果您的项目超过您的屏幕尺寸,它将可以滚动

您只需使用 GridLayoutManager 而不是 LinearLayoutManager

 /**
 * Creates a vertical GridLayoutManager
 *
 * @param context Current context, will be used to access resources.
 * @param spanCount The number of columns in the grid
 */
public GridLayoutManager(Context context, int spanCount) {
    super(context);
    setSpanCount(spanCount);
}

如果您希望 Recyclerview 包装其内容(全高度拉伸包装其内容)。 只需用 NestedScrollView 包装它。 我测试了它的工作。

<androidx.core.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="wrap_content"
  >

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <!-- This Recyclerview will fit content.
    So it become full height stretch wrap its content-->
    <RecyclerView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Bayar SPP"
        style="@style/FontStyleSubtitle"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/recyclerView" />

   </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.core.widget.NestedScrollView>

使用此代码:

recyclerView.layoutManager = GridLayoutManager(context, splitcount)

这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM