Diseño de flujo de cascada de Android Fragment + RecyclerView

1. Imagen de efecto de cascada

2. Utilice RecyclerView para implementar el diseño de flujo en cascada

Inserte la descripción de la imagen aquí

2.1 Uso de RecyclerView

RecyclerView es similar a ListView. Ambos usan Adapter (Adapter) para generar elementos de lista. La diferencia es que RecyclerView usa un RecyclerView.Adapter mejorado. RecyclerView.Adapter necesita implementar tres métodos.

2.1.1 onCreteViewHolder (ViewGroup viewGroup , int i);

Este método se utiliza para crear componentes de elementos de lista.

2.1.2 onBindViewHolder (ViewHolder viewHolder, int i);

Este método es responsable de vincular datos para el componente del elemento de la lista y se ejecutará nuevamente cada vez que el componente se muestre nuevamente.

2.1.3 getItemCount ();

El valor de retorno de este método determina cuántos elementos de la lista se incluyen.

2.2 Ejemplo de código de adaptador

public class StaggeredGridAdater extends RecyclerView.Adapter<StaggeredGridAdater.HomeViewHolder> {
    
    

    private Context mContext;
    private List<Home> homeList = new ArrayList<>();

    public StaggeredGridAdater(Context context,List<Home> homeList){
    
    
        this.mContext = context;
        this.homeList = homeList;
    }

    //创建列表组件
    @NonNull
    @Override
    public StaggeredGridAdater.HomeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_item,null);
        return new StaggeredGridAdater.HomeViewHolder(view,this);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(@NonNull HomeViewHolder holder, int position) {
    
    
        holder.imageIdIv.setImageResource(homeList.get(position).getImageId());
        holder.nameTv.setText(homeList.get(position).getName());
    }

    //返回列表数据总数
    @Override
    public int getItemCount() {
    
    
        return homeList.size();
    }


    public class HomeViewHolder extends RecyclerView.ViewHolder{
    
    
        TextView nameTv;
        ImageView imageIdIv;
        private RecyclerView.Adapter adapter;
        public HomeViewHolder(@NonNull View itemView,RecyclerView.Adapter adapter) {
    
    
            super(itemView);
            this.nameTv = itemView.findViewById(R.id.home_item_text);
            this.imageIdIv = itemView.findViewById(R.id.home_item_mage);
            this.adapter = adapter;
        }
    }
}

Para gestionar de forma eficaz los subcomponentes contenidos en el elemento de la lista, se define una clase HomeViewHolder adicional. Cree un elemento de lista a través de onCreateViewHolder () y
páselo.

2.3 Código de fragmento (o actividad)

public class HomeFragment extends Fragment {
    
    

    private RecyclerView recyclerView;
    private List<Home> homeList = new ArrayList<>();

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
    
    
        View root = inflater.inflate(R.layout.fragment_home, container, false);

        recyclerView = root.findViewById(R.id.home_recycler);
        //设置RecyclerView保持固定大小,这样可以优化RecyclerView的性能
        recyclerView.setHasFixedSize(true);

        initData();

        //设置瀑布流布局为2列,垂直方向滑动
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));

        StaggeredGridAdater staggeredGridAdater = new StaggeredGridAdater(this.getActivity(),homeList);

        //创建分割线对象
        recyclerView.addItemDecoration(new MyDecoration());

        recyclerView.setAdapter(staggeredGridAdater);

        return root;
    }

    //数据源
    private void initData() {
    
    
        String[] names = new String[]{
    
    "车位查询","车位预定","与车间距","防盗警报","停车时长","车位查询","车位预定","与车间距","防盗警报","停车时长"};
        int[] ImageId = new int[]{
    
    R.drawable.car1,R.drawable.car2,R.drawable.car3,R.drawable.car4,R.drawable.car5,R.drawable.car1,R.drawable.car2,R.drawable.car3,R.drawable.car4,R.drawable.car5};
        for(int i = 0 ;i < names.length ; i++){
    
    
            this.homeList.add(new Home(names[i],ImageId[i]));
        }
    }

    //分割线的类
    class MyDecoration extends RecyclerView.ItemDecoration{
    
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state){
    
    
            super.getItemOffsets(outRect,view ,parent,state);
            int gap = getResources().getDimensionPixelSize(R.dimen.dividerHeight);//5dp
            outRect.set(gap,gap,gap,gap);
        }
    }

}

2.4 Clase local

public class Home {
    
    
    private String name;
    private int ImageId;

    public Home(String name,int ImageId){
    
    
        this.name = name;
        this.ImageId = ImageId;
    }

    public int getImageId() {
    
    
        return ImageId;
    }

    public void setImageId(int imageId) {
    
    
        ImageId = imageId;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }
}

2.5 Código XML de diseño principal

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--android:divider 分割线-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/home_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="56dp"
        android:background="@color/colorWhite">
    </androidx.recyclerview.widget.RecyclerView>

</LinearLayout>

2.6 Subdisposición de elementos

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/home_item_mage"
        android:scaleType="centerCrop"/>

    <TextView
        android:id="@+id/home_item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="2dp"
        android:layout_gravity="left|bottom"
        android:padding="12dip"
        android:background="#85000000"
        android:textColor="#ffffffff"
        android:text="Golden Gate"
        android:textStyle="bold"/>
</FrameLayout>

Supongo que te gusta

Origin blog.csdn.net/qq_45708835/article/details/108694610
Recomendado
Clasificación