如何使用 RecyclerView 制作具有相同宽度行的列表?

Posted

技术标签:

【中文标题】如何使用 RecyclerView 制作具有相同宽度行的列表?【英文标题】:How to make a list with RecyclerView with rows of the same width? 【发布时间】:2020-12-28 05:23:05 【问题描述】:

由于某种原因,我的行大小不一样。我尝试了所有方法,但没有成功。顺便说一下,我对 android 很陌生。

我尝试更改我的 row.xml,但没有成功:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardCornerRadius="3dp"
    app:cardElevation="3dp"
    app:cardUseCompatPadding="true">
    <RelativeLayout
        android:layout_
        android:layout_
        android:padding="16dp"
        android:layout_gravity="top">

        <ImageView
            android:id="@+id/imageIv"
            android:layout_
            android:layout_
            android:background="@drawable/circulo_azul"
            android:src="@drawable/transferenciablue" />

        <TextView
            android:id="@+id/titleTv"
            android:layout_
            android:layout_
            android:layout_marginStart="10dp"
            android:layout_marginLeft="10dp"
            android:layout_toEndOf="@id/imageIv"
            android:layout_toRightOf="@id/imageIv"
            android:text="Title"
            android:textColor="#000"
            android:textSize="22sp"
            android:textStyle="bold" />


    </RelativeLayout>



</androidx.cardview.widget.CardView>

这是activitymain.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation = "vertical"
    tools:context=".MainActivity"
    >

    <androidx.recyclerview.widget.RecyclerView
        android:layout_
        android:layout_
        android:layout_marginTop="100dp"
        android:id="@+id/recyclerView"/>
</LinearLayout>

带有 onBindViewHolder 的 MyAdapter.java:

package com.example.demoapp;


import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import android.content.Context;

public class MyAdapter extends RecyclerView.Adapter<MyHolder> 
    Context c;
    ArrayList<Model> models; // this array list creates a list of arrays which parameters define in my model class

    public MyAdapter(Context c, ArrayList<Model> models) 
        this.c = c;
        this.models = models;
    

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) 
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row,null); // this line inflate my row
        return new MyHolder(view); // this will return my view to holder class
    

    @Override
    public void onBindViewHolder(@NonNull MyHolder myHolder, int i) 
        myHolder.mTitle.setText(models.get(i).getTitle()); // here i is position
        myHolder.mImaeView.setImageResource(models.get(i).getImg());

    

    @Override
    public int getItemCount() 
        return models.size();
    

MyHolder 类:

package com.example.demoapp;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class MyHolder extends RecyclerView.ViewHolder 
    ImageView mImaeView;
    TextView mTitle;
    public MyHolder(@NonNull View itemView) 
        super(itemView);
        this.mImaeView = itemView.findViewById(R.id.imageIv);
        this.mTitle = itemView.findViewById(R.id.titleTv);
    

我需要改变什么以使它们看起来成比例?谢谢

【问题讨论】:

将布局更改为线性布局,并将图像视图和电视的权重添加为 2 和 8,并让它们的宽度为 0 dp 你仍然可以使用相对布局也许你应该尝试 alignparentend true for tv 以及当前限制 【参考方案1】:

确保您将在 BindViewHolder 中编写此类代码:

 @Override
public folder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
    View view = LayoutInflater.from(context).inflate(R.layout.your_layout_name,parent,false);
    return new viewHolderClass(view);

由于viewGroup无法使用,某些时间宽度无法正常显示

【讨论】:

我将分享我的 BindViewHolder,但它与您的非常相似 inflate 方法我想我只有inflate(R.layout.row,null) parent 是父视图的对象,它在 oncreateViewHolder 构造函数中的初始值是 ViewGroup 对象 我不认为我有父视图的对象 我添加了 myholder 类【参考方案2】:

android:layout_gravity="top" 更改为android:layout_gravity="center"

【讨论】:

我改变了它,但行保持在顶部。所以我在回收站视图中添加了一个边距顶部,现在它在中心。但问题是行的大小不同。

以上是关于如何使用 RecyclerView 制作具有相同宽度行的列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现让RecyclerView有不同尺寸的item

如何使用 RecyclerView 制作两列?

如何使用不同类型的项目制作 RecyclerView? [复制]

如何给recyclerView瀑布流设置均等间距

如何给recyclerView瀑布流设置均等间距

如何使用具有相同控制器的 Laravel 制作网站和 API REST?