Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
创始人
2024-04-05 15:19:28
0

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

列表视图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; // 声明一个列表视图对象@Overrideprotected 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 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); // 设置列表视图的长按监听器}@Overridepublic 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; // 行星列表的列表适配器@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_focus);initFocusSpinner(); // 初始化焦点抢占方式的下拉框}// 初始化焦点抢占方式的下拉框private void initFocusSpinner() {ArrayAdapter focusAdapter = new ArrayAdapter(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 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文件


第二个XML文件


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

相关内容

热门资讯

北京市房屋建筑使用安全条例 北京市人民代表大会常务委员会公告 〔十六届〕第46号 《北京市房屋建筑使用安全条例》已由北京市第十六...
吉比特(603444)披露制定... 截至2025年12月29日收盘,吉比特(603444)报收于423.52元,较前一交易日下跌2.3%...
《北京市房屋建筑使用安全条例》... 《北京市房屋建筑使用安全条例》(以下简称《条例》)已由北京市第十六届人民代表大会常务委员会第二十次会...
股市必读:ST葫芦娃因涉嫌违反... 截至2025年12月29日收盘,ST葫芦娃(605199)报收于8.41元,下跌4.97%,换手率0...
公告精选 | 赣锋锂业涉嫌内幕... 风险提示 天箭科技(002977.SZ):公司相关军品2025年度进行了价格审核,与客户签订了《军品...
如何避免夫妻共同债务纠纷 有纠... 夫妻共同债务纠纷是婚姻破裂时的高发矛盾,会涉及日常借贷、经营投资等多重场景。那如何避免夫妻共同债务纠...
旋极信息:将持续关注海南自贸区... 有投资者在互动平台向旋极信息提问:“请问在海自贸区有那些业务布局?” 针对上述提问,旋极信息回应称:...
财经不烧脑 | 信用修复政策来... 你是不是也有这样的烦恼?就一次忘了还钱,金额可能也不大,结果征信报告上“挂”了整整五年!房贷、车贷、...
涉绑架杀害中国公民 犯罪嫌疑人... 中国青年报客户端北京12月29日电(中青报·中青网记者 何春中)记者今天从公安部获悉,公安部近日派出...
恒誉环保(688309)披露关... 截至2025年12月29日收盘,恒誉环保(688309)报收于23.88元,较前一交易日上涨2.58...