Невозможно выровнять 2 вида карт по вертикали внутри RecyclerView - PullRequest
0 голосов
/ 29 мая 2020

У меня есть 2 CardView и 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 Layout:

    <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 Layout:

<?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>

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Итак, я внес несколько изменений в приведенный выше код, и он решил обе проблемы (независимое скольжение и вертикальное выравнивание)

Я добавил еще один recyclerview в main_activity. xml

<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, отдельные классы для обоих держателей просмотра, а также удалил операторы switch и itemViewType из классов RecyclerViewAdapter и RecyclerViewAdapter2:

    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) и где я сделал ошибку в предыдущем подходе?

0 голосов
/ 29 мая 2020

ConstraintLayout не является родителем с прокруткой, поэтому при добавлении в него длинного RecyclerView возникнут проблемы.

...