Android 带有标题和水平和垂直滚动的网格布局

Android 带有标题和水平和垂直滚动的网格布局,android,android-recyclerview,header,Android,Android Recyclerview,Header,我需要一个水平和垂直滚动网格布局 每行都有标题 我的要求是行中的标题只能垂直滚动。 当项目水平滚动时,标题应始终在第0列可见 有人能告诉我怎么办吗 我在给我的密码 import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recycle

我需要一个水平和垂直滚动网格布局 每行都有标题

我的要求是行中的标题只能垂直滚动。 当项目水平滚动时,标题应始终在第0列可见

有人能告诉我怎么办吗

我在给我的密码


import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;
/*
both horizontal and vertical scrolling working ref BuildCoding Srinivas tutorial
 Tested by Laks on 2nd Nov 2020

 Header added and working 19/11/20 but Header also scrolls horizontally which is not required

 ref https://en.proft.me/2017/11/25/how-add-custom-header-recylerview/
 */
public class MainActivity extends AppCompatActivity {
    private RecyclerView TrayA, TrayB,TrayC,TrayD,TrayE;
    private RecyclerViewAdapter trayAadapter,trayBadapter,trayCadapter,trayDadapter,trayEadapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TrayA = findViewById(R.id.recyclerViewA);


        trayAadapter = new RecyclerViewAdapter(this);


   //     TrayA.setLayoutManager(new LinearLayoutManager(this));
        // 5 rows by 6 columns
        GridLayoutManager gridLayoutManagerA = new GridLayoutManager(this,6);
       // gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

        gridLayoutManagerA.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return trayAadapter.getItemViewType(position) == ListItem.TYPE_HEADER ? 6 : 1;
            }
        });

        TrayA.setLayoutManager(gridLayoutManagerA);
        ViewCompat.setNestedScrollingEnabled(TrayA,false);
        TrayA.setItemAnimator(new DefaultItemAnimator());
        TrayA.setHasFixedSize(true);
        TrayA.setAdapter(trayAadapter);





        ArrayList<ListItem> contacts = new ArrayList<>();
        contacts.add(new Header("Tray A"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Header("Tray B"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
        contacts.add(new Header("Tray C"));
        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
        contacts.add(new Header("Tray D"));
        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
        contacts.add(new Header("Tray E"));
        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        contacts.add(new Contact("Bradly cooper", "156121651", "https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
        contacts.add(new Contact("Saoirse Ronan", "5654646", "https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));

        trayAadapter.setContacts(contacts);
      /*  trayBadapter.setContacts(contacts);
       trayCadapter.setContacts(contacts);
        trayDadapter.setContacts(contacts);
        trayEadapter.setContacts(contacts); */
    }
}

导入androidx.appcompat.app.appcompat活动;
导入androidx.core.view.ViewCompat;
导入androidx.recyclerview.widget.DefaultItemAnimator;
导入androidx.recyclerview.widget.GridLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入android.os.Bundle;
导入java.util.ArrayList;
/*
水平和垂直滚动工作参考BuildCoding Srinivas教程
Laks于2020年11月2日进行测试
页眉于20年11月19日添加并工作,但页眉也会水平滚动,这不是必需的
裁判https://en.proft.me/2017/11/25/how-add-custom-header-recylerview/
*/
公共类MainActivity扩展了AppCompatActivity{
私人垃圾回收公司TrayA,TrayB,TrayC,TrayD,TrayE;
专用回收器适配器TrayAdapter,TrayAdapter,TrayAdapter,TrayAdapter,TrayAdapter,TrayAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TrayA=findViewById(R.id.RecycleriveWa);
trayAadapter=新的RecycleServiceAdapter(此);
//TrayA.setLayoutManager(新直线布局经理(本));
//5行6列
GridLayoutManager GridLayoutManager=新的GridLayoutManager(这个,6);
//gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
GridLayoutManager.setPansizeLookup(新的GridLayoutManager.SpanSizeLookup(){
@凌驾
公共整数getSpanSize(整数位置){
return trayAadapter.getItemViewType(position)==ListItem.TYPE\u头?6:1;
}
});
setLayoutManager(GridLayoutManager);
ViewCompat.setNestedScrollingEnabled(TrayA,false);
setItemAnimator(新的DefaultItemAnimator());
TrayA.setHasFixedSize(真);
TrayA.setAdapter(trayAadapter);
ArrayList联系人=新建ArrayList();
联系人。添加(新标题(“托盘A”);
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新标题(“托盘B”);
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新标题(“托盘C”);
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新标题(“托盘D”);
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新联系人(“Bradly cooper”、“156121651”、”https://www.biography.com/.image/t_share/MTE1ODA0OTcxNTEyODU4MTI1/bradley-cooper-547062-1-402.jpg"));
联系人。添加(新联系人(“Saoirse Ronan”、“5654646”、”https://www.nova.ie/wp-content/uploads/2017/12/Ronan-1.png"));
联系人。添加(新标题(“托盘E”);
package in.precitron.recyclview;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

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

    private ArrayList<ListItem> contacts = new ArrayList<>();
    private Context context;

    public RecyclerViewAdapter(Context context) {
        this.context = context;
    }




    @Override
    public RecyclerView.ViewHolder onCreateViewHolder( ViewGroup viewGroup, int viewType) {

        if(viewType == ListItem.TYPE_HEADER) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header_layout, viewGroup, false);
            VHHeader holder = new VHHeader(v);
            return holder;
        } else if(viewType == ListItem.TYPE_ITEM) {
            View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.recycler_view_list_item, viewGroup, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
        throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");



    }

    @Override
    public void onBindViewHolder( RecyclerView.ViewHolder viewHolder, int position) {

        if(viewHolder instanceof VHHeader) {
            Header header = (Header) contacts.get(position);
            VHHeader VHheader = (VHHeader)viewHolder;
            VHheader.tvName.setText(header.getName());
        } else if(viewHolder instanceof ViewHolder) {
            Contact person = (Contact)contacts.get(position);

            ViewHolder Vh = (ViewHolder) viewHolder;

            Vh.name.setText(person.getName());
            Vh.number.setText(person.getNumber());
            Glide.with(context)
                    .asBitmap()
                    .load(person.getImageUrl())
                    .into(Vh.imageView);
        }


    }

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

    @Override
    public int getItemViewType(int position) {return contacts.get(position).getItemType();
    }

    public void setContacts(ArrayList<ListItem> contacts) {
        this.contacts = contacts;
        notifyDataSetChanged();
    }

    public class VHHeader extends RecyclerView.ViewHolder{
        TextView tvName;
        public VHHeader(View itemView) {
            super(itemView);
            this.tvName = (TextView)itemView.findViewById(R.id.tvName);
        }
    }


    public  class ViewHolder extends RecyclerView.ViewHolder{

          ImageView imageView;
          TextView name;
          TextView number;

        public ViewHolder( View itemView) {
            super(itemView);

            imageView = (ImageView) itemView.findViewById(R.id.image);
            name = (TextView) itemView.findViewById(R.id.name);
            number = (TextView) itemView.findViewById(R.id.number);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="10dp">

       <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:scrollbars="none">

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

       </HorizontalScrollView>

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation="10dp"
    app:cardCornerRadius="10dp"
    android:layout_margin="10dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.cardview.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:cardCornerRadius="75dp"
            android:shape="ring"
            android:id="@+id/cardView"
            android:padding="10dp">

            <ImageView
                android:id="@+id/image"
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:src="@drawable/ic_launcher_background" />

        </androidx.cardview.widget.CardView>

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_toRightOf="@+id/cardView"
            android:text="name"
            android:textSize="18sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/name"
            android:layout_margin="10dp"
            android:layout_toRightOf="@+id/cardView"
            android:text="number"
            android:textSize="18sp" />

    </RelativeLayout>

</androidx.cardview.widget.CardView>