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>

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

相关文章
|
2月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
114 3
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
236 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
203 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
515 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
227 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
2月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
107 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
1月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
120 0
|
2月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
101 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
2月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
122 4
|
2月前
|
XML 编解码 Android开发
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
188 0
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡