Android 详解基本布局以及ListView和RecyclerView

news2025/1/16 16:39:58

前言

一个丰富的界面有很多个控件组成,那么就需要布局来实现控件有条不紊的摆放。

一 LinearLayout 线性布局

LinearLayout 又称作线性布局,是一种常用的布局。有横向和竖向两个方向。

通过下面的属性进行设置

android:orientation="vertical"
android:orientation="horizontal"
 1 

1 layout_gravity

控制该组件在父组件的对齐方式

2 gravity

控制组件所包含的子元素的对齐方式

3 layout_weight 

使用比例的方式来指定控件的大小。这个权重是分配的屏幕剩余空间

下面的三个方块,如若只有一个设置这个属性为的话,那么他会占满屏幕

如果两个都设置的话 那么两个均分剩下的空间

如若三个都设置为1的话,那么三个均分全部的空间

 

 

    <LinearLayout
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:background="@color/purple_200"
        android:layout_weight="1"
        />
    <LinearLayout
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:background="#ee00dd"
        android:layout_weight="1"
        />
    <LinearLayout
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:background="#00a000"
        android:layout_weight="1"
        />

 

 

 二 RelativeLayout 相对布局

主要通过定位的方式让控件出现在布局的任何位置。

1 相对于父容器而言

1> layout_alignParentLeft

左对齐

2> layout_alignParentRight

右对齐

3> layout_centerInParent

在父容器中间

2 相对于兄弟容器而言

1>layout_toLeftOf

放置于参考组件的左边

2> layout_above

放置于参考组件的上方,就是我的Bottom对着你的Top

3> layout_alignLeft

对齐参考组件的左边

 

 

  <RelativeLayout
      android:id="@+id/btn"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:background="@color/purple_200"
      android:layout_centerInParent="true"
      />

    <RelativeLayout
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#00ff00"
        android:layout_above="@+id/btn"
        android:paddingBottom="100dp"
        android:layout_alignLeft="@+id/btn"
        />

三 FrameLayout 帧布局

相比前两种比较少用,所有空间都会默认放置在布局的左上角。

有两个属性可以用 
foreground  设置前景
foregroundGravity 前景的位置

 

    <FrameLayout
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:background="#00ff00"
        />
    <FrameLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:foreground="@drawable/demo1"
        android:foregroundGravity="bottom|right"
        android:background="#ffff00"
        />
    <FrameLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#ff0000"
        />

四 TableLayout 表格布局

就像是一个表格,每个TableLayout 由多个TableRow 构成

1 常见属性

1> collapseColumns 需要隐藏的列号 从0 开始

2> stretchColumns 需要拉伸的列号

3> shrinkColumns 允许被收缩的列号

2 子控件常见的属性

1> android:layout_span 横向夸两列显示 
2> layout_column 显示在第几列

 

<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:collapseColumns="0"
    android:stretchColumns="1"

    >

    <TableRow>
        <Button android:text="你好"
            android:layout_span="2"
            android:layout_column="1"
            />
        <Button android:text="你好"/>
    </TableRow>

    <TableRow>
        <Button android:text="你好"/>
        <Button android:text="你好"/>
        <Button android:text="你好"/>
        <Button android:text="你好"/>

    </TableRow>

    <Button android:text="1 行"/>
    <Button android:text="2 行"/>




    </TableLayout>

五 网格布局 GridLayout

1 常见属性

1> orientation方向设置

2> columnCount 每一列的数量

3> rowCount 行的数量

2 子控件常见属性

1 > layout_column 显示在第几列

2> layout_columnSpan 横向跨几列

3> layout_columnWeight 横向剩余空间分配方式

 

<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:columnCount="3"
    >

    <Button android:text="第一个"
        android:layout_column="2"
        />
    <Button android:text="第二个"
        android:layout_columnSpan="1"
        android:layout_columnWeight="0"
        />
    <Button android:text="第三个" />
    <Button android:text="第四个" />
    <Button android:text="第五个" />



</GridLayout>

六 ConstraintLayout 约束布局

可视化的方式来编写界面

七  ListView

非常常用的组件,以列表的形式显示具体内容

提升运行的效率,对加载好的布局进行缓存。

基本使用

xml

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Bean

package com.example.leonardoday1;

public class Bean {

    String name;

    public Bean(String name) {
        this.name = name;
    }


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

adapter

package com.example.leonardoday1;

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

import java.util.List;

public class MyAdapter extends BaseAdapter {

    private Context context;
    private List<Bean> datas;

    public MyAdapter(Context context, List<Bean> datas) {
        this.context = context;
        this.datas = datas;
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        // Tag从本质上来讲是就是相关联的view的额外的信息。它们经常用来存储一些view的数据,这样做非常方便而不用存入另外的单独结构。
        // 用View中的setTag(Onbect)给View添加1个格外的数据,再用getTag()获得到对应的View。
        if (view == null){
            view =  LayoutInflater.from(context).inflate(R.layout.list_item,viewGroup,false);
            viewHolder = new ViewHolder();
            viewHolder.textView =  view.findViewById(R.id.tv);
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
        }
//        TextView tv = view.findViewById(R.id.tv);
        String name = datas.get(i).name;
//        tv.setText(name);
        viewHolder.textView.setText(name);
        return view;
    }


    private  final  class ViewHolder{
        TextView textView;
    }


}

调用

  for (int i = 0; i < 100; i++) {
            Bean bean = new Bean("ok i find you" + i);
            datas.add(bean);
        }

        ListView lv = findViewById(R.id.lv);
        // 配置数据
        lv.setAdapter(new MyAdapter(this,datas));
        // 点击监听
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Log.e(TAG, "onItemClick: ");
            }
        });

八  RecyclerView

更为强大的滚动组件

因为ListView 只能实现纵向滚动。要是实现横向滚动的时候就不行了 。

首先想要使用这个控件,必须在build.gradle 中添加相应的依赖库才行

implementation 'androidx.recyclerview:recyclerview:1.3.0'

xml

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

adapter

package com.example.leonardoday1;

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

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import org.w3c.dom.Text;

import java.util.List;

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {


    private List<Bean> datas;
    private Context context;

    public MyRecyclerAdapter(List<Bean> datas, Context context) {
        this.datas = datas;
        this.context = context;
    }

    @NonNull
    @Override
    public MyRecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = View.inflate(context,R.layout.recyclerview_item,null);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyRecyclerAdapter.MyViewHolder holder, int position) {
        // 绑定数据方法设置值
        holder.tv.setText(datas.get(position).name);

    }

    @Override
    public int getItemCount() {
        // 这个方式显示多少item
        return datas == null ?  0 :  datas.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tv;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//             Google废弃了getAdapterPosition()方法,但是却又提供了getBindingAdapterPosition()和
//             getAbsoluteAdapterPosition()这两个方法。从方法名可以看出来,一个是用于获取元素位于当前绑定Adapter的位置
//             一个是用于获取元素位于Adapter中的绝对位置(一般常用的就是这个)。
                    // 调用自己的监听方法
                    mItemClickListener.onReceiveItemClick(getBindingAdapterPosition());
                }
            });

        }
    }
    private  OnRecyclerItemClickListener mItemClickListener;
    public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener){
        mItemClickListener = listener;
    }
    // 创建一个接口 回调点击事件
    public interface OnRecyclerItemClickListener{
        void onReceiveItemClick(int position);
    }
}

调用

package com.example.leonardoday1;

import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Leonardo";
    private List<Bean> datas = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i < 100; i++) {
            Bean bean;
            if (i % 4 != 0){
                bean = new Bean("ok i need u and you" + i);
            }else{
                bean = new Bean("ok ok BalaBalaBalauBalaBalaBalauok BBalaBalaBalauBalaBalaBalaualaBalaBalauBalaBalaBalau" + i);
            }
            datas.add(bean);
        }

        RecyclerView rv = findViewById(R.id.rv);
        MyRecyclerAdapter adapter =  new MyRecyclerAdapter(datas,this);
        // 设置adapter
        rv.setAdapter(adapter);
        // 设置布局
        // 这里设置为线性的布局
//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//        rv.setLayoutManager(layoutManager);

        // 网格布局
//         Context context,
//    int spanCount, 一行显示3个
//    int orientation,
//    boolean reverseLayout
//        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
//        rv.setLayoutManager(gridLayoutManager);

//         int spanCount, 一行几个
//    int orientation
        // 瀑布流布局
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
        rv.setLayoutManager(staggeredGridLayoutManager);

        // 设置监听 自己实现的监听方法
        adapter.setRecyclerItemClickListener(new MyRecyclerAdapter.OnRecyclerItemClickListener() {
            @Override
            public void onReceiveItemClick(int position) {
                Log.e(TAG, "onReceiveItemClick: " + position);
            }
        });


    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算

参考文献&#xff1a;Standardized assays for determining the catalytic activity and kinetics of peroxidase-like nanozymes | Nature Protocols SCI-Hub链接&#xff1a; https://sci-hub.se/10.1038/s41596-018-0001-1 科研需要&#xff0c;需要绘制所制备纳米酶的Mi…

亿发软件:中小企业定制一体化管理解决方案,全面提升数据价值

亿发软件&#xff1a;中小企业定制一体化管理解决方案&#xff0c;全面提升数据价值 一体化信息管理系统是为中小企业提供简化运营、提高效率和生产力的工具。随着经济的快速发展&#xff0c;企业细分管理的多样化需求显著增加。很多企业都在为找不到适合自己的一体化信息管理…

一文看懂数据云平台的“可观测性”技术实践

背景 这是一家大型制造集团。为监控及预测工厂设备运行情况&#xff0c;IT部门在数据云平台DataSimba上按天执行数据作业&#xff0c;每24小时对工厂设备的日志数据进行分析&#xff0c;发现能对业务起到很好的辅助作用&#xff0c;效果不错。 “要不升级为每1个小时跑一次&am…

android hook(Toast BadTokenException案例)

什么是Hook? hook 技术又叫做钩子函数&#xff0c;在系统没有调用该函数之前&#xff0c;钩子程序先捕捉该消息&#xff0c;钩子函数先得到控制权&#xff0c;这时钩子函数即可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;还可以强制结束消息的传递。…

(详细)HTTP协议(应用层重点协议)

目录 一、HTTP协议工作过程 二、 协议格式 1、抓包工具Fiddler 2、HTTP请求格式 3、HTTP响应格式 4、HTTP协议格式总结 三、HTTP请求&#xff08;Request&#xff09; 1、URL &#xff08;1&#xff09;URL基本格式 &#xff08;2&#xff09;URL实例 &#xff08;…

什么是伪原创?SEO伪原创该怎么做

伪原创是指在原有的文章或内容基础上进行修改或调整&#xff0c;以产生看起来是全新内容的文章&#xff0c;但实际上并没有创造新的价值。多数情况下&#xff0c;伪原创的目的是为了在文章相对原创的情况下&#xff0c;提高搜索引擎的排名。 一、高质量伪原创 做好伪原创&#…

SpringCloud消息总线——Bus

Bus 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 在SpringCloud Config学习过程中&#xff0c;还遗留下来一个问题&#xff1a;当运维更新git上的配置信息时&#xff0c;要想更改所有的客户端服务&#xff0c;必须得手动给客户端服务发送post请…

ESP32学习笔记14-mqtt-连接官方mqtt,onenet,thingsboard物联网平台

12.MQTT 12.0工程里的WiFi密码和ssid设置 工程的WiFi配置 ssid password 打开配置 配置ssid和密码 工程配置文件sdkconfig IP和端口配置 乐鑫服务器mqtt 12.1数据结构和配置函

力扣sql中等篇练习(四)

力扣sql中等篇练习(四) 1 游戏玩法分析IV 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 首次登录后第二天登录的玩家数量/玩家总数量(去重) # 注意首日注册指的是表中的最早的一个日期 SELECT ROUND((SELECT count(distinct t1.player_id)FRO…

给孩子买台灯什么牌子好?盘点学生专用台灯第一品牌

现在的孩子近视率很高&#xff0c;双减政策的执行&#xff0c;也有导致许多孩子长时间接触电子产品&#xff0c;没有正确的看书姿势&#xff0c;合理的用眼距离等&#xff0c;使用专业的护眼台灯&#xff0c;能让孩子眼睛拥有一个好的视力。 要注意养成预防近视好习惯&#xf…

dsp28335杂记3

文章目录 DAC实验&#xff0c;SPITLV5620DACADC0实验-------niceDMAADC实验&#xff08;外设到存储器&#xff09; 中断 了解皮毛&#xff0c;嘿嘿内置XINTF接口配置 外扩SRAM DMA支持 了解皮毛&#xff0c;嘿嘿eCAP脉冲捕获&#xff0c;重点啦eCAP输出PWM&#xff08;APWM模…

【学习笔记】从MySQL快速入门 PostgreSQL

PGSQL 菜鸟教程/在线api文档 数据类型语法 DML条件 高级 一、数据类型 数值类型&#xff1a;和mysql类似&#xff0c;叫法不同 特殊&#xff1a;serial 自增整数 名字存储长度描述范围smallint2 字节小范围整数-32768 到 32767integer4 字节常用的整数-2147483648 到 21474…

C++——入门讲解(3)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月19日 内容&#xff1a;C入门内容讲解 目录 前言&#xff1a; 1. 引用&#xff08;续&#xff09;&#xff1a; 1.输出型参数&#xff1a; 2.传引用返回&#xff1a; 2.常引用&#xff1a; 3.auto&#xff1a; 结…

Android安全性:保护你的应用和用户数据

Android安全性&#xff1a;保护你的应用和用户数据 引言 在移动应用开发领域&#xff0c;Android系统占据着主导地位&#xff0c;随着智能手机的广泛普及和移动应用的快速发展&#xff0c;越来越多的开发者投入到Android应用的开发中。然而&#xff0c;随着Android应用的数量不…

React--》useReducer的讲解与使用

目录 useReducer的使用 刨析useReducer参数 useReducer的使用 useReducer的使用 在React函数式组件中&#xff0c;我们可以通过useState()来创建state&#xff0c;这种state创建方式会给我们返回两个东西state和setState()。state用来读取数据&#xff0c;而setState()用来…

走心Python实战应用:【requests+re 模块】快速下载原shen图片

人生苦短&#xff0c;我用python 这次给大家带来的是模块实战 以便大家理解学习 觉得写的好的话&#xff0c;可以给我多多点赞鸭~ 走心Python实战应用&#xff1a;【requestsre 模块】快速下载原shen图片 一、理解Python requests 模块二、requests 方法三、ruqusets 模块实…

第15章_File类与IO流

第15章_File类与IO流 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。 一个File对…

渗透测试成功的8个关键,98%的人都理解错了

01 知道为什么要测试 执行渗透测试的目的是什么&#xff1f;是满足审计要求&#xff1f;是你需要知道某个新应用在现实世界中表现如何&#xff1f;你最近换了安全基础设施中某个重要组件而需要知道它是否有效&#xff1f;或者渗透测试根本就是作为你定期检查防御健康的一项例行…

最新版本 Stable Diffusion 开源 AI 绘画工具之中文自动提词篇

✨ 目录 &#x1f388; 标签生成器&#x1f388; 提示词自动补全 &#x1f388; 标签生成器 由于输入正向提示词 prompt 和反向提示词 negative prompt 都是使用英文&#xff0c;所以对学习母语的我们非常不友好使用网址&#xff1a;https://tinygeeker.github.io/p/ai-prompt…

第05讲:OpenTracing 简介,先有标准后有天

自从 Google Dapper 的论文发布之后&#xff0c;各大互联网公司和开源社区开发的分布式链路追踪产品百花齐放&#xff0c;同时也给使用者带来了一个问题&#xff0c;各个分布式链路追踪产品的 API 并不兼容&#xff0c;如果用户在各个产品之间进行切换&#xff0c;成本非常高。…