Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)

news/2024/7/16 10:17:48 标签: android studio, android, ide, java, 个人开发

需要图片集或全部源码请点赞关注收藏后评论区留言~~

列表视图ListView

如果想在页面上直接显示全部列表信息,就要引入新的列表视图ListView,列表视图允许在页面上分行展示相似的数据列表。

列表视图新增的属性与方法如下

divider 指定分割线的图形

dividerHeight 指定分割线的高度

listSelector 指定列表项的按压背景

往列表视图填充数据也很容易,先利用基本适配器实现列表适配器,再调用setAdapter方法设置适配器对象,下面是使用列表视图在界面上展示行星列表的例子

1:修改列表视图的分割线样式

2:修改列表项的按压背景

 

 

下面修改了列表项的点击问题 新增了几个按钮 让界面显得更加美观和用户友好 

 

 最后,代码如下

Java类代码

package com.example.chapter08;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter08.adapter.PlanetListAdapter;
import com.example.chapter08.bean.Planet;
import com.example.chapter08.util.Utils;

import java.util.List;

public class ListViewActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    private final static String TAG = "ListViewActivity";
    private CheckBox ck_divider;
    private CheckBox ck_selector;
    private ListView lv_planet; // 声明一个列表视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        ck_divider = findViewById(R.id.ck_divider);
        ck_selector = findViewById(R.id.ck_selector);
        ck_divider.setOnCheckedChangeListener(this);
        ck_selector.setOnCheckedChangeListener(this);
        List<Planet> planetList = Planet.getDefaultList(); // 获得默认的行星列表
        // 构建一个行星列表的列表适配器
        PlanetListAdapter adapter = new PlanetListAdapter(this, planetList);
        // 从布局视图中获取名叫lv_planet的列表视图
        lv_planet = findViewById(R.id.lv_planet);
        lv_planet.setAdapter(adapter); // 设置列表视图的适配器
        lv_planet.setOnItemClickListener(adapter); // 设置列表视图的点击监听器
        lv_planet.setOnItemLongClickListener(adapter); // 设置列表视图的长按监听器
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        refreshListView(); // 刷新列表视图
    }

    // 刷新列表视图
    private void refreshListView() {
//        lv_planet.setCacheColorHint(Color.TRANSPARENT); // 防止滚动时列表拉黑
        if (ck_divider.isChecked()) { // 显示分隔线
            // 从资源文件获得图形对象
            Drawable drawable = getResources().getDrawable(R.color.red);
            lv_planet.setDivider(drawable); // 设置列表视图的分隔线
            lv_planet.setDividerHeight(Utils.dip2px(this, 5)); // 设置列表视图的分隔线高度
        } else { // 不显示分隔线
            lv_planet.setDivider(null); // 设置列表视图的分隔线
            lv_planet.setDividerHeight(0); // 设置列表视图的分隔线高度
        }
        if (ck_selector.isChecked()) { // 显示按压背景
            lv_planet.setSelector(R.drawable.list_selector); // 设置列表项的按压状态图形
        } else { // 不显示按压背景
            //lv_planet.setSelector(null); // 直接设置null会报错,因为运行时报空指针异常
            // 从资源文件获得图形对象
            Drawable drawable = getResources().getDrawable(R.color.transparent);
            lv_planet.setSelector(drawable); // 设置列表项的按压状态图形
        }
    }

}

 第二个类

package com.example.chapter08;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;

import com.example.chapter08.adapter.PlanetListWithButtonAdapter;
import com.example.chapter08.bean.Planet;

import java.util.List;

public class ListFocusActivity extends AppCompatActivity {
    private final static String TAG = "ListFocusActivity";
    private ListView lv_planet; // 声明一个列表视图对象
    private PlanetListWithButtonAdapter adapter; // 行星列表的列表适配器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_focus);
        initFocusSpinner(); // 初始化焦点抢占方式的下拉框
    }

    // 初始化焦点抢占方式的下拉框
    private void initFocusSpinner() {
        ArrayAdapter<String> focusAdapter = new ArrayAdapter<String>(this,
                R.layout.item_select, focusArray);
        Spinner sp_focus = findViewById(R.id.sp_focus);
        sp_focus.setPrompt("请选择焦点抢占方式"); // 设置下拉框的标题
        sp_focus.setAdapter(focusAdapter); // 设置下拉框的数组适配器
        sp_focus.setSelection(0); // 设置下拉框默认显示第一项
        // 给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
        sp_focus.setOnItemSelectedListener(new FocusSelectedListener());
    }

    private String[] focusArray = {
            "在子控件之前处理",
            "在子控件之后处理",
            "不让子控件处理",
    };

    class FocusSelectedListener implements AdapterView.OnItemSelectedListener {
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            if (arg2 == 0) {  // 在子控件之前处理
                showListView(ViewGroup.FOCUS_BEFORE_DESCENDANTS); // 显示指定抢占方式的列表视图
            } else if (arg2 == 1) {  // 在子控件之后处理
                showListView(ViewGroup.FOCUS_AFTER_DESCENDANTS); // 显示指定抢占方式的列表视图
            } else if (arg2 == 2) {  // 不让子控件处理,此时才会响应列表项的点击和长按事件
                showListView(ViewGroup.FOCUS_BLOCK_DESCENDANTS); // 显示指定抢占方式的列表视图
            }
        }

        public void onNothingSelected(AdapterView<?> arg0) {}
    }

    // 显示指定抢占方式的列表视图
    private void showListView(int focusMethod) {
        List<Planet> planetList = Planet.getDefaultList(); // 获得默认的行星列表
        // 构建一个行星列表的列表适配器
        adapter = new PlanetListWithButtonAdapter(this, planetList, focusMethod);
        // 从布局视图中获取名叫lv_planet的列表视图
        lv_planet = findViewById(R.id.lv_planet);
        lv_planet.setAdapter(adapter); // 设置列表视图的适配器
        lv_planet.setOnItemClickListener(adapter); // 设置列表视图的点击监听器
        lv_planet.setOnItemLongClickListener(adapter); // 设置列表视图的长按监听器
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp">

        <CheckBox
            android:id="@+id/ck_divider"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="left|center"
            android:text="显示分隔线"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <CheckBox
            android:id="@+id/ck_selector"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="left|center"
            android:text="显示按压背景"
            android:textColor="@color/black"
            android:textSize="17sp" />

    </LinearLayout>

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

    <!--
    <ListView
        android:id="@+id/lv_planet"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@null"
        android:listSelector="@color/transparent" />
        -->

</LinearLayout>

第二个XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="焦点抢占方式:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <Spinner
            android:id="@+id/sp_focus"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="left|center"
            android:spinnerMode="dialog" />
    </LinearLayout>

    <ListView
        android:id="@+id/lv_planet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@color/transparent" />

</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~


http://www.niftyadmin.cn/n/4427.html

相关文章

最全面的Mybatis教程,从“开局”到“通关”,Ready Go!

前言 本文为SSM框架 【Mybatis】 相关知识&#xff0c;MyBatis 是一款优秀的半自动的ORM持久层框架&#xff0c;下边将对Mybatis的简介、Mybatis的CRUD实现&#xff0c;Mybatis的配置文件&#xff0c;Mybatis的日志配置&#xff0c;resultMap详解&#xff0c;分页实现&#xff…

计算机毕业设计(附源码)python自习室管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【CSDN RSS订阅】将你的博客订阅至个人网站

目录一、前情提要二、RSS是什么&#xff1f;三、将CSDN博客订阅至我的网站四、将【知乎每日精选】订阅到我的网站五、我不是程序员&#xff0c;我怎么订阅5.1 RSS订阅地址5.2 RSS订阅器5.3 PC订阅实战一、前情提要 查看我的CSDN主页的时候&#xff0c;发现了下面这个东西&…

论文写作--30条总结

1&#xff1a;写论文要学会八股&#xff0c;严格将正确的内容放在它自己的位置上&#xff0c;结果清晰&#xff0c;语言要通俗易懂。 2&#xff1a;有一些单词的使用要谨慎&#xff0c;比如Dont这种简写&#xff0c;应该写成do not&#xff1b;不要使用未出现在任何学术论文中…

【Flutter小记3】Android打开前置或广角摄像头的同时打开闪光灯方案

在某些情景下&#xff0c;我们希望打开广角摄像头的同时&#xff0c;也能打开闪光灯&#xff01;&#xff08;iOS 默认支持&#xff0c;Android 除了主摄外的摄像头均无法打开闪光灯&#xff09; 首先通过咨询与查找相关Android资料得到如下两个结论&#xff1a; 1. 首先查阅…

ESP8266-Arduino编程实例-TDS(溶解固体总量)水质传感器驱动

TDS(溶解固体总量)水质传感器驱动 TDS (Total Dissolved Solids,溶解固体总量)传感器用于计指示溶液中的总溶解固体,如盐、矿物质和金属。 这些参数可用于了解水质并比较不同来源的水。 TDS 计的主要应用之一是水族馆水质监测。 TDS具有如下特性: 输入电压:DC 3.3 ~ 5…

EdrawMax Ultimate v12.0 图表和流程图

EDraw Max 是一个多合一的应用程序&#xff0c;用作演示构建器、图表创建者、可视化业务规划师和协作空间&#xff08;用于快速共享图表和模型并接收反馈&#xff09;。 该软件可用于哪些潜在用途&#xff1f; 任何人都可以从 EDraw Max 中受益。它所针对的主题和感兴趣的领域…

猿创征文 | Linux运维工程师的10个日常使用工具分享

猿创征文 | Linux运维工程师的10个日常使用工具分享一、本次分享工具导航二、Adminer数据库管理工具1.Adminer介绍2.Adminer的特点3.Adminer的使用4.Adminer的使用感受三、Memos碎片化知识管理工具1.Memos简介2.Memos的使用3.Memos的使用感受四、Linux服务器集群管理工具——AP…