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

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

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

列表视图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>

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

相关文章
|
1天前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
8 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
3天前
|
存储 BI Android开发
全开源仿第八区H5APP封装打包分发系统源码
全开源仿第八区H5APP封装打包分发系统源码
34 4
|
21天前
|
运维 Cloud Native Android开发
云原生之旅:容器化与微服务架构的融合之道安卓应用开发入门指南
本文将深入探讨云原生技术的核心要素——容器化和微服务架构,并揭示它们如何共同推动现代软件的开发与部署。通过实际案例分析,我们将看到这两种技术如何相辅相成,助力企业实现敏捷、可扩展的IT基础设施。文章旨在为读者提供一条清晰的道路,指引如何在云原生时代利用这些技术构建和优化应用。 本文将引导初学者了解安卓应用开发的基本概念和步骤,从安装开发环境到编写一个简单的“Hello World”程序。通过循序渐进的讲解,让读者快速掌握安卓开发的核心技能,为进一步深入学习打下坚实基础。
34 1
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的房屋租赁App的详细设计和实现(源码+lw+部署文档+讲解等)
|
25天前
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
93 2
|
7天前
|
C# 开发工具
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
|
11月前
|
存储 缓存 安全
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
427 0
|
4月前
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
133 1
|
4月前
|
Android开发 网络架构
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
680 1
|
4月前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
209 0
下一篇
云函数