【Android入门到项目实战--3.4】—— ListView控件的使用

这篇具有很好参考价值的文章主要介绍了【Android入门到项目实战--3.4】—— ListView控件的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、ListView的简单用法

二、进一步优化ListView界面

三、提升ListView的效率(优化)

四、ListView的点击事件


本篇文章主要讲解最常用的控件之一:ListView的使用。

        当我们的程序有大量的数据需要展示的时候,可以借助ListView实现。ListView允许用户上下滑动滚动屏幕,如:查看QQ聊天记录。

一、ListView的简单用法

 首先新建一个新的活动,csdn7.xml中的代码如下:

        布局中引入ListView控件和前面其他控件用法一致。

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

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

</LinearLayout>

csdn7.java代码如下:

        首先准备好一个数据数组用来展示,通过适配器将数据传给ListView,ArrayAdapter的构造函数中依次传入上下文、ListView子项布局的id,要适配的数据。注意:这里使用的android.R.layout.simple_list_item_1为Android内置的布局文件,里面只有一个TextView,用于简单显示一段文本。最后调用ListView的setAdapter()方法,将适配器对象传进去,这样ListView和数据之间的关联就建立完成。

public class csdn7 extends AppCompatActivity {

    private String[] data = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_csdn7);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                csdn7.this, android.R.layout.simple_list_item_1, data);
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}

效果如下:

安卓listview控件的用法,Android,android,android studio,ui

二、进一步优化ListView界面

        只显示一段文本的ListView很单调,下面对ListView界面添加图片进行美观。效果如下:

安卓listview控件的用法,Android,android,android studio,ui

 

新建一个Image类,作为ListView适配器的适配类型,代码如下:

        name表示每行字母的名字,imageId表示图片id。

public class Image {
    private String name;
    private int imageId;
    
    public Image(String name,int imageId){
        this.name = name;
        this.imageId = imageId;
    }
    public String getName(){
        return name;
    }
    public int getImageId(){
        return imageId;
    }
}

 接下来需要为ListView子项指定自定义的布局,在layout目录下新建item.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>

</LinearLayout>

接下来创建一个自定义的适配器adapter类,,代码如下:

        adapter重写了父类的构造函数,用于将上下文,ListView子项布局的id和数据传递进来。

        重写getView()方法,此方法在每个子项被滚动到屏幕内时调用。

        在getView()方法中,首先通过getItem方法得到当前项的image实例,然后使用LayoutInflater方法来为这个子项加载传入的布局,LayoutInflater方法的inflate方法接收3个参数,第三个参数指定为false,表示只让在父布局中声明的layout属性生效,接下来获取到两个实例,并分别调用setImageResource和setText方法设置显示的图片和文字,最后将布局返回,这样自定义的适配器就完成了。

public class adapter extends ArrayAdapter<Image> {
    private int resourceId;
    public adapter(Context context, int textViewResourceId, List<Image> objects){
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;
    }
    
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Image image = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView image2 = view.findViewById(R.id.image);
        TextView name = view.findViewById(R.id.name);
        image2.setImageResource(image.getImageId());
        name.setText(image.getImageId());
        return view;
    }
}

下面修改主类csdn7.java的代码如下:

        首先,自定义一个init()方法初始化list中的元素,然后创建自定义适配器adapter的实例,最后将适配器传递给ListView,这样就完成了。

public class csdn7 extends AppCompatActivity {

    private List<Image> list = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_csdn7);
        init();//初始化数据
        adapter ad = new adapter(csdn7.this,R.layout.item,list);
        ListView listview = findViewById(R.id.list_view);
        listview.setAdapter(ad);
    }
    
    private void init(){
        for(int i = 0; i < 5; i++){
            Image a = new Image("A",R.drawable.image1);
            list.add(a);
            Image b = new Image("B",R.drawable.image1);
            list.add(b);
            Image c = new Image("C",R.drawable.image1);
            list.add(c);
            Image d = new Image("D",R.drawable.image1);
            list.add(d);
            Image e = new Image("E",R.drawable.image1);
            list.add(e);
        }
    }
}

        现在只用修改item.xml文件中的内容,就可以做出各种复杂的界面了。

三、提升ListView的效率(优化)

        目前,上面的代码还有待优化的地方,如:adapter的getView()方法中,每次都将布局重新加载一遍,当ListView快速滚动的时候,运行效率会降低。再比如:每次在getView()方法中都会调用findViewById()方法获取控件实例。下面就对这两个问题进行优化。

修改adapter中的getView()方法中的代码,如下:

        getView()方法有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,如果为null则加载布局,如果不为null则直接重用convertView。这样优化了第一个问题。

    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Image image = getItem(position);
        View view;
        if(convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        }else{
            view = convertView;
        }
        ImageView image2 = view.findViewById(R.id.image);
        TextView name = view.findViewById(R.id.name);
        image2.setImageResource(image.getImageId());
        name.setText(image.getName());
        return view;
    }

再次修改getView()方法中的代码,如下:

        新增一个内部类ViewHolder,用于对控件的实例进行缓存,当convertView为null时,创建一个ViewHolder对象,将控件的实例都存放在ViewHolder里,调用setTag()方法,将ViewHolder对象存放在View中;不为null时,调用getTag,重新取出。这样优化了第二个问题。

   public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Image image = getItem(position);
        View view;
        ViewHolder viewHolder;
        if(convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.image = view.findViewById(R.id.image);
            viewHolder.name = view.findViewById(R.id.name);
            view .setTag(viewHolder);

        }else{
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.image.setImageResource(image.getImageId());
        viewHolder.name.setText(image.getName());
        return view;
    }
    class ViewHolder{
        ImageView image;
        TextView name;
    }

四、ListView的点击事件

        点击事件是不可或缺的,前面的只是满足视觉上的效果,点击事件才是实际用途。

修改csdn7.java的代码,如下:

        原理同前面按钮的点击事件一致,创建实例后,调用setOnItemClickListener()方法为ListView注册监听器,通过参数i判断用户点击的子项。

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_csdn7);
        init();//初始化数据
        adapter ad = new adapter(csdn7.this,R.layout.item,list);
        ListView listview = findViewById(R.id.list_view);
        listview.setAdapter(ad);
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Image image = list.get(i);
                Toast.makeText(csdn7.this, image.getName(), Toast.LENGTH_SHORT).show();
            }
        });
    }

效果如下:

安卓listview控件的用法,Android,android,android studio,ui

 


希望本文章对你有帮助,如果你对Android开发感兴趣,请持续关注本专栏,帮助你从入门到项目实战,你将收获:Android基础开发、各种经典功能实现、项目实战、开发自己的APP、将APP上传应用商店、靠广告赚钱等等,持续更新ing......文章来源地址https://www.toymoban.com/news/detail-730297.html

到了这里,关于【Android入门到项目实战--3.4】—— ListView控件的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio安卓开发--ListView学习整理

    ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。 (1)activity_main.xml布局中加入ListView控件:(先占满整个布局的空间) (2)MainActivity.java中使用ListView展示大量数据: 使用ArrayAdapter泛型类(指定为String)将数据

    2024年01月20日
    浏览(47)
  • ListView控件的使用

    ListView是由ListView控件、Adapter适配器、ListView子布局、传入的数据格式、指定Adapter适配器  共5个部分组成 首先,在想要使用ListView控件的地方写上ListView控件  编写ListView的每条的布局,也就是ListView的子布局 这里我写了两个并列的textview,效果如下:  编写传入数据的数据格

    2023年04月18日
    浏览(69)
  • C#中listView控件详细使用方法

    当使用C#中的 ListView 控件时,你可以通过以下详细方法使用它: 在窗体上放置 ListView 控件: 在 Visual Studio 的窗体设计器中,从工具箱中拖动并放置一个 ListView 控件到你的窗体上。 设置 ListView 的属性: View :设置 ListView 的显示模式。常见的显示模式包括 Details (详细信息)

    2024年02月16日
    浏览(44)
  • Android安卓实战项目---登陆注册页面(源码在文末)

    效果图: 这段代码是一个简单的Android应用中的登录功能代码,下面逐行解释其功能和作用: 导入相关的类和包: 这些导入语句引入了用于构建Android应用界面、处理用户交互和数据存储的必要类和包。 定义一个名为 LoginActivity 的类,它继承自 AppCompatActivity ,表示这是一个用

    2024年02月13日
    浏览(40)
  • 【Android入门到项目实战-- 11.4】—— ExoPlayer视频播放器框架的详细使用

    目录 什么是ExoPlayer 一、基本使用  1、添加依赖项  2、布局 3、Activity 二、自定义播放暂停 1、首先如何隐藏默认的开始暂停和快进? 2、自定义 三、控制视频画面旋转和比例调整 四、全屏放大和缩小 1、双击视频放大缩小 2、按钮放大缩小 五、完整的实现代码 XML Activity   

    2024年02月11日
    浏览(56)
  • 【Android入门到项目实战-- 9.5】—— 陀螺仪传感器的详细使用教程

    目录 陀螺仪传感器 1、基础知识  2、实战使用         返回x、y、z轴的角加速度数据。         水平逆时针旋转,z轴为正,顺时针为负;         向左旋转,y轴为负,向右旋转,y为正;         向上旋转,x为负,向下旋转,x为正。 修改activity_main.xml代码如下:

    2024年02月12日
    浏览(53)
  • Android安卓实战项目(2)---健身UI APP(源码在文末)

    1.大致浏览 2.功能介绍 (1)功能一 第一个界面点击后可以弹出图像,如图: (2)功能二 界面二的控件可以通过滑动下拉条来调解 MainActivity.java PopupActivity.java FitnessMove.java 链接:https://pan.baidu.com/s/1fE-Koh-VmnFOxNKF9CsQNA?pwd=jynl 提取码:jynl 有开发需求私信作者 15135757306

    2024年02月15日
    浏览(44)
  • Android安卓实战项目(5)---完整的健身APP基于安卓(源码在文末)可用于比赛项目或者作业参考中

    1.大致浏览 【bilibili视频】 https://www.bilibili.com/video/BV1uX4y177iR/?share_source=copy_webvd_source=b2e9b9ed746acda34f499009647748ed (1)开机动画 (2)App介绍 (3)身体指标填写 (4)体脂计算 (5)主页功能介绍 (1)主项目实现 这段代码是一个名为 MainActivity 的 Android 活动(Activity)类。分析

    2024年02月10日
    浏览(48)
  • layui的基本使用-日期控件的业务场景使用入门实战案例一

    效果镇楼;       1 前端UI层面;   苟日新一刻钟总结反观:  2  那么业务场景的话,就没有那么简单了。首先就是解决方案里面可不止一个文件夹,是多个项目组成的解决方案。比如仓储层,Repository项目,业务层项目,Services,同时各自对应了各自的接口项目;Model 实体

    2024年02月13日
    浏览(35)
  • 【Android入门到项目实战-- 11.1】—— 实现悬浮按钮

            悬浮按钮是悬浮于界面之上,滑动屏幕时按钮不会跟随屏幕移动,它是Design Support库中提供的一个控件,这个控件可以帮助我们轻松实现悬浮按钮效果。         下面实现一个发布的悬浮按钮。        由于需要用到floatingActionButton,所以先导入,可参考这篇文

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包