【问题标题】:Unable to Align 2 Cardviews Vertically Inside RecyclerView无法在 RecyclerView 内垂直对齐 2 个 Cardview
【发布时间】:2023-03-27 19:12:02
【问题描述】:

我有 2 个 CardViews 和一个 RecyclerView 但我是

  1. 无法垂直对齐

  2. 无法独立滑动它们(如果我在错误的解决方法中滑动任何一个,则两个都滑动)

我尝试了一些解决方法以及不同的教程,例如 edmt Dev 和 CodingWithMitch,并在 stackoverflow 上搜索了类似的问题,但问题似乎仍然存在。那么我如何垂直对齐两个卡片视图,同时仍然能够独立和水平滑动它们。

(代码适用于单卡视图)

主要活动:

public class MainActivity extends AppCompatActivity {


List<Articles> articlesData;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    articlesData = new ArrayList<>();

    //Repeats
    articlesData.add(new Articles("10 Necessary Gadgets","Gadgets","Gadgets You Must Carry",R.drawable.bagchaincustom));
    articlesData.add(new Articles("10 Benefits of Pre-Planning the Day","Self Improvement","Benefits of Planning in Advance",R.drawable.planner1custom));

    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(layoutManager);
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, articlesData);
    recyclerView.setAdapter(adapter);

}

这里是activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerview"
        android:orientation="horizontal">
        </androidx.recyclerview.widget.RecyclerView>

</androidx.constraintlayout.widget.ConstraintLayout>

这里是 RecyclerViewAdapter 类:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final int LAYOUT_ONE= 0;
private static final int LAYOUT_TWO= 1;

@Override
public int getItemViewType(int position)
{
    if(position == LAYOUT_ONE){
        return LAYOUT_TWO;
    }
    else {
        return LAYOUT_ONE;
    }
}


private static final String Tag = "RecyclerViewAdapter";
private Context mContext;
private List<Articles> mData;

public RecyclerViewAdapter(Context mContext, List<Articles> mData) {
    this.mContext = mContext;
    this.mData = mData;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    LayoutInflater mInflater = LayoutInflater.from(mContext);
    View view;


    switch (viewType) {
        case 0:
            ViewHolder1 viewHolder1;
            view = mInflater.inflate(R.layout.layout_listitem, parent, false);
            return new ViewHolder1(view);

        case 1:
            ViewHolder2 viewHolder2;
            view = mInflater.inflate(R.layout.layout_listitem2, parent, false);
            return new ViewHolder2(view);

        default:
            return null;
    }

}



@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {

    switch (holder.getItemViewType()){
        case 0:
            ViewHolder1 viewHolder1 = (ViewHolder1)holder;
        viewHolder1.tv_article_title.setText(mData.get(position).getTitle());
            viewHolder1.img_article_thumbnail.setImageResource(mData.get(position).getThumbnail());
            viewHolder1.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, ArticlesActivity.class);
                intent.putExtra("Title", mData.get(position).getTitle());
                intent.putExtra("Description", mData.get(position).getDescription());
                intent.putExtra("Thumbnail", mData.get(position).getThumbnail());
                intent.putExtra("Category", mData.get(position).getCategory());
                mContext.startActivity(intent);
            }
        });
        break;

        case 1:
            ViewHolder2 viewHolder2 = (ViewHolder2)holder;
            viewHolder2.tv_article_title2.setText(mData.get(position).getTitle());
            viewHolder2.img_article_thumbnail2.setImageResource(mData.get(position).getThumbnail());
            viewHolder2.cardView2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(mContext, ArticlesActivity.class);
                    intent.putExtra("Title", mData.get(position).getTitle());
                    intent.putExtra("Description", mData.get(position).getDescription());
                    intent.putExtra("Thumbnail", mData.get(position).getThumbnail());
                    intent.putExtra("Category", mData.get(position).getCategory());
                    mContext.startActivity(intent);
                }
            });
            break;

    }
}

@Override
public int getItemCount() {
    return mData.size();
}

public class ViewHolder1 extends RecyclerView.ViewHolder{
    TextView tv_article_title;
    ImageView img_article_thumbnail;
    CardView cardView;

    public ViewHolder1(@NonNull View itemView) {
        super(itemView);
        tv_article_title = (TextView) itemView.findViewById(R.id.article_title_id);
        img_article_thumbnail = (ImageView) itemView.findViewById((R.id.article_image_id));
        cardView = (CardView) itemView.findViewById(R.id.cardview_id);

    }
}


public class ViewHolder2 extends RecyclerView.ViewHolder{
    TextView tv_article_title2;
    ImageView img_article_thumbnail2;
    CardView cardView2;


    public ViewHolder2(@NonNull View itemView) {
        super(itemView);
        tv_article_title2 = (TextView) itemView.findViewById(R.id.article_title_id2);
        img_article_thumbnail2 = (ImageView) itemView.findViewById((R.id.article_image_id2));
        cardView2 = (CardView) itemView.findViewById(R.id.cardview_id2);

    }
}


}

这是文章类:

public class Articles {

private String Title;
private String Category;
private String Description;
private int Thumbnail;

public Articles(String title, String category, String description, int thumbnail) {
    Title = title;
    Category = category;
    Description = description;
    Thumbnail = thumbnail;
}

public String getTitle() {
    return Title;
}

public String getCategory() {
    return Category;
}

public String getDescription() {
    return Description;
}

public int getThumbnail() {
    return Thumbnail;
}

这里是 CardView -> layout_listitem 布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/tools"
    android:layout_alignParentStart="true"
    android:id="@+id/rview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/tools"
    android:id="@+id/cardview_id"
    android:layout_width="120dp"
    android:layout_height="220dp"
    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardCornerRadius="0dp"
    app:cardElevation="0dp">

    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/article_image_id"
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:background="#2d2d2d"
            android:scaleType="centerCrop"></ImageView>

        <TextView
            android:id="@+id/article_title_id"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:gravity="center"
            android:text="Article Name"
            android:textSize="14sp">

        </TextView>

    </LinearLayout>

</androidx.cardview.widget.CardView>

</LinearLayout>

这里是 CardView -> layout_listitem2 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/tools"
    android:layout_alignParentStart="true"
    android:id="@+id/rview2"
    android:layout_below="@+id/rview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="300dp">

    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:card_view="http://schemas.android.com/tools"
        android:id="@+id/cardview_id2"
        android:layout_below="@id/cardview_id"
        android:layout_width="120dp"
        android:layout_height="220dp"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground"
        app:cardCornerRadius="0dp"
        app:cardElevation="0dp">

        <LinearLayout
            android:layout_marginTop="250dp"
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/article_image_id2"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:background="#2d2d2d"
                android:scaleType="centerCrop"></ImageView>

            <TextView
                android:id="@+id/article_title_id2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:gravity="center"
                android:text="Article Name Sec"
                android:textSize="14sp">

            </TextView>

        </LinearLayout>

    </androidx.cardview.widget.CardView>


</LinearLayout>

【问题讨论】:

    标签: android android-recyclerview cardview


    【解决方案1】:

    所以我对上面的代码做了一些修改,它解决了这两个问题(独立滑动和垂直对齐)

    我在 main_activity.xml 中添加了另一个 recyclerview

    <LinearLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    
    </androidx.recyclerview.widget.RecyclerView>
    
        <androidx.recyclerview.widget.RecyclerView
            android:layout_below="@+id/recyclerview_id2"
            android:layout_marginTop="10dp"
            android:id="@+id/recyclerview_id2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            tools:ignore="NotSibling">
        </androidx.recyclerview.widget.RecyclerView>
    
    
    </LinearLayout>
    

    我还为新的 recyclerview 创建了另一个适配器,为两个视图创建了单独的类,并从 RecyclerViewAdapter 和 RecyclerViewAdapter2 类中删除了 switch 语句和 itemViewType:

        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View view;
        LayoutInflater mInflater = LayoutInflater.from(mContext);
        view = mInflater.inflate(R.layout.layout_listitem2,parent,false);
        return new ViewHolder(view);
    
    }
    
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    
        holder.tv_article_title2.setText(mData.get(position).getTitle());
        holder.img_article_thumbnail2.setImageResource(mData.get(position).getThumbnail());
        holder.cardView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,ArticlesActivity.class);
                intent.putExtra("Title",mData.get(position).getTitle());
                intent.putExtra("Description",mData.get(position).getDescription());
                intent.putExtra("Thumbnail",mData.get(position).getThumbnail());
                intent.putExtra("Category",mData.get(position).getCategory());
                mContext.startActivity(intent);
            }
        });
    
    }
    
    @Override
    public int getItemCount() {
        return mData.size();
    }
    
    public static class ViewHolder extends RecyclerView.ViewHolder{
    
        TextView tv_article_title2;
        ImageView img_article_thumbnail2;
        CardView cardView2;
    
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
    
            tv_article_title2 = (TextView) itemView.findViewById(R.id.article_title_id2);
            img_article_thumbnail2 = (ImageView) itemView.findViewById((R.id.article_image_id2));
            cardView2 = (CardView) itemView.findViewById(R.id.cardview_id2);
        }
    }
    

    我还编辑了 main_acitivty 类,在末尾添加了新的 recyclerview 和布局管理器:

    LinearLayoutManager layoutManager2 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
        RecyclerView recyclerView2 = findViewById(R.id.recyclerview_id2);
        recyclerView2.setLayoutManager(layoutManager2);
        RecyclerViewAdapter2 adapter2 = new RecyclerViewAdapter2(this, articlesData);
        recyclerView2.setAdapter(adapter2);
    

    即使这种解决方法解决了我面临的两个问题,还有其他更好/更完善的方法(例如,使用单个 recyclerview)吗?我在以前的方法中哪里犯了错误?

    【讨论】:

      【解决方案2】:

      ConstraintLayout 不是滚动父级,所以如果你在其中添加一个长 RecyclerView 会产生问题。

      【讨论】:

      • 将其更新为线性和相对布局,还尝试添加新的 RecyclerView 和新的适配器,但它们要么重叠,要么没有显示,cardview 中的所有项目都混淆了。
      • 尽量不要将卡片视图放在线性布局中。您可以直接使用固定宽度和高度的 CardLayout 或使用 wrap content。
      • 删除了卡片视图的线性布局,并将约束布局替换为 main_activity.xml 中的线性布局,也使用了不同的方法,两个初始问题都已修复,但新方法似乎不太完善。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2011-05-13
      • 2021-09-12
      • 2022-10-13
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多