ListView实用指南

2024-09-03 12:38
文章标签 实用 指南 listview

本文主要是介绍ListView实用指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近编码中遇到和ListView有关的问题,索性在干完活之后写一整个博客出来,一方面是分享给大家一起学习,二来是让自己理一理全部的思路.

ListView控件采用了MVC模式将前段显示和后端数据进行分离.也就是说ListView加载数据时不是简单的一个listview.add来添加,而是先加数据添加到控制器(Adapter),再将adapter中的数据添加到listview.ListView几乎用在了所有APP中,要显示大量有序数据的话ListView无疑是最好的选择.我将分为简单Listview实现,自定义ListView,ListView增删改操作的实现,ListView事件获取四个方面来介绍.

简单ListView实现

在操作ListView前,我们先要定义一个ListView控件.

	<ListView
   	 	android:id="@+id/listview"
   	 	android:layout_width="fill_parent"
   	 	android:layout_height="wrap_content">
	</ListView>
 
 

在向ListView装载数据前需要定义一个adapter.


其中this来获取上下文对象,

android.R.layout.simple_list_item_1,用来指定ListView显示模板,一般来说我们会自定义一个模板,这里用的是AndroidSDK提供的模板,你可以在

<Android SDK安装目录>\platforms\android-\data\layout目录找到.

data是我们要显示的数据集,这里我定义了一个数据集data

	private String[] data=new String[]{"第一行",
        	"第二行",
        	"第三行",
        	"第四行",
        	"第五行",
        	"第六行",
       	 	"第七行",
       	 	"第八行",
        	"第九行",
        	"第十行",
        	"第十一行",
        	"第十二行",
        	"第十三行",
        	"第十四行"};

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
        R.layout.list_item,data);
listView.setAdapter(adapter);

运行之后就可以显示了.要在加载时九选定某一行,可以添加如下代码,这样就默认选中第12行.

	ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
	listView.setAdapter(adapter);
	listView.setSelection(12);


自定义ListView模板的实现

很多时候由于SDK提供的模板不足以满足我们的要求,我们需要自定义模板,来完成我们自己的数据显示.比如说我需要实现如下界面


这时候我们就需要定义自己的模板.在layout下新建资源文件list_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:descendantFocusability="blocksDescendants"
    android:layout_width="match_parent"
    android:layout_height="64dp"><RelativeLayout
        android:layout_weight="3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"><LinearLayout
            android:layout_marginLeft="10dp"
            android:layout_centerVertical="true"
            android:orientation="vertical"
android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/remarkInList" android:focusable="true" android:textSize="22dp" android:textStyle="bold" android:singleLine="true" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="@+id/dateInList" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout> <LinearLayout android:layout_marginRight="10dp" android:layout_weight="4" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text=" ¥ " android:textSize="30dp" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/spendMoneyInList" android:layout_width="wrap_content" android:layout_height="match_parent" android:textSize="30dp" android:textStyle="bold" android:singleLine="true" android:focusable="true" android:layout_gravity="center_horizontal|center_vertical" android:gravity="center_vertical|center_horizontal" /> </LinearLayout></LinearLayout>
在代码中定义好要显示的数据集后,在代码中实现

List<Map<String,String>> list=new ArrayList<>();//保存list数据
for (int x=0;x<data.length;x++){Map<String,String>map=new HashMap<>();//定义map集合
    map.put("data",data[x]);
    map.put("date",date[x]);
    map.put("text",text[x]);
    list.add(map);//增加数据
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this,//实例化Simpleadapter
        list,//要包装的数据集和
        R.layout.list_item,//模板
        new String[]{"data","date","text"},//定义要显示的mapkey
        new int[]{R.id.remarkInList,R.id.dateInList,R.id.spendMoneyInList}//用来显示的id
        );

listView.setAdapter(simpleAdapter);//设置显示数据
这样我们九完成看自定义模板的显示


ListView中的增删改操作的实现

我们用listview的目标肯定不止于此,更多的时候我们需要动态的来添加,删除,修改listview中的内容.这样的话我们就需要自定义一个数据集和adapter来操作了.
public class myListViewAdapterDates {String remark,money,date,unixTime;

    public String getUnixTime() {return unixTime;
    }public void setUnixTime(String unixTime) {this.unixTime = unixTime;
    }public String getMoney() {return money;
    }public void setMoney(String money) {this.money = money;
    }public String getDate() {return date;
    }public void setDate(String date) {this.date = date;
    }public String getRemark() {return remark;
    }public void setRemark(String remark) {this.remark = remark;
    }public myListViewAdapterDates() {}public myListViewAdapterDates(String remark, String date, String money) {this.remark = remark;
        this.date = date;
        this.money = money;
        this.date = date;
    }
}

public class myListViewAdapter extends BaseAdapter {private Context context;
    private List<myListViewAdapterDates> datas = new ArrayList<myListViewAdapterDates>();//定义要显示的list集合

    public myListViewAdapter(Context context,List<myListViewAdapterDates> datas) {this.context = context;
        this.datas=datas;
    }@Override
    public int getCount() {if (datas == null)return 0;
        return datas.size();
    }@Override
    public Object getItem(int position) {return datas.get(position);
    }@Override
    public long getItemId(int position) {return position;
    }@Override
    public View getView(int position, View convertView, ViewGroup parent) {convertView = View.inflate(context, R.layout.list_item,null);

        myListViewAdapterDates entity = datas.get(position);//list集合中取出数据并现实到页面中
        ((TextView) convertView.findViewById(R.id.remarkInList)).setText(entity.getRemark());
        ((TextView)convertView.findViewById(R.id.dateInList)).setText(entity.getDate());
        ((TextView)convertView.findViewById(R.id.spendMoneyInList)).setText(entity.getMoney());
        return convertView;
    }/** 移除item数据 */
    public void delData(int position) {if (datas != null && datas.size() > 0)datas.remove(position);// 移除指定数据
    }public void removeAll(){datas.clear();
    }
}
接下来我们在代码中实现listview与adapter的绑定.与增删改的实现.
public class Activity2 extends Activity {private myListViewAdapter adapter;
    private ListView listView;
    private List<myListViewAdapterDates> Arrays = new ArrayList<>();
    private static int count = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView= (ListView) findViewById(R.id.listview);
        adapter=new myListViewAdapter(this,Arrays);//绑定adapter与数据集
        listView.setAdapter(adapter);
    }public void add(int position,String remark, String money, String date){//增加列表项到指定位置
        myListViewAdapterDates dates=new myListViewAdapterDates();
        dates.setDate(date);
        dates.setRemark(remark);
        dates.setMoney(money);
        Arrays.add(position,dates);//增加列表项到指定位置  0代表最顶端
        adapter.notifyDataSetChanged();
        count++;
    }public  void modify(int position,String remark, String money, String date){//修改指定列表项内容
        /**
         * 我们可以先删掉指定项内容,然后在次进行修改
         * ***/
        del(position);
        add(position,remark, money, date);
    }public void del(int position){//删除指定列表项

        adapter.delData(position);
        adapter.notifyDataSetChanged();
        if (count > 0)count--;
    }public void delAll(){//删除所有列表项
        adapter.removeAll();
        adapter.notifyDataSetChanged();
    }
}

ListView事件获取

我们可以通过listview的OnItemClickListener,OnItemSelectedListener,OnItemLongClickListener来完成对listview事件的获取.
listView.setOnItemClickListener(new OnItemClickListener1());//列表项点击事件
listView.setOnItemSelectedListener(new OnItemSelectedListener1());//列表项选择事件
listView.setOnItemLongClickListener(new ItemLongClickListener1());//列表项长按事件


private class OnItemClickListener1 implements android.widget.AdapterView.OnItemClickListener {@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {//列表项点击后处理
    }
}private class OnItemSelectedListener1 implements AdapterView.OnItemSelectedListener {@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {//列表项选择后处理
    }@Override
    public void onNothingSelected(AdapterView<?> parent) {//列表项无选择处理
    }
}private class ItemLongClickListener1 implements AdapterView.OnItemLongClickListener {@Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {//列表项长按处理
        return false;
    }
}

本文到此结束,demo我稍后上传,欢迎大家指出文中不足之处,共同进步.


这篇关于ListView实用指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132981

相关文章

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque

文章目录 ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项 ConcurrentLinkedDeque ConcurrentLinkedDeque 是 Java 并发工具包(java.util.concurrent 包)中的一个线程安全的双端队列(Deque)实现,实现了 Deque 接口。它使用了链表结构,并且针对高并发环境进行了优化,非常适合

使用Nginx部署前端Vue项目的详细指南

在本文中,我们将详细介绍如何使用Nginx部署一个前端Vue项目。此过程涵盖Vue项目的构建、Nginx的安装与配置、以及最后的项目启动。下面是步骤的详细说明。 步骤 1: 准备你的Vue项目 确保你已经创建并构建了一个Vue项目。如果你尚未创建Vue项目,可以使用以下命令创建一个: # 安装Vue CLInpm install -g @vue/cli# 创建一个新的Vue项目vue c

入门指南 | Datavines 安装部署篇

摘要:本文主要介绍基于源码部署 Datavines 和执行检查作业,内容主要分为以下几个部分: 平台介绍快速部署运行数据质量检查作业 Datavines 的目标是成为更好的数据可观测性领域的开源项目,为更多的用户去解决元数据管理和数据质量管理中遇到的问题。在此我们真诚欢迎更多的贡献者参与到社区建设中来,和我们一起成长,携手共建更好的社区。 https://github.com/dat

listview与复选框的合并使用

在使用listview的过程中,我们常常需要使用复选框,实现一些批处理功能。这时候我们需使用自定义的adapter,实现相关复选框的事件响应。      首先在adapter定义一个哈希表,用于存放复选框的选中情况:      如private static HashMap<String,Boolean> isSelected,private static HashMap<Inter

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构