无法在RecyclerView内垂直对齐2张卡片视图

问题描述 投票:0回答:2

我有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 recycler-adapter cardview
2个回答
0
投票

ConstraintLayout不是滚动父级,因此如果在其中添加一个较长的RecyclerView,它将产生问题。


0
投票

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

我在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);
    }
}

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

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),并且在以前的方法中我在哪里出错了?

© www.soinside.com 2019 - 2024. All rights reserved.