热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发之ListView(实现列表与其点击事件)

文章目录效果预览基本构架activity_main.xml条目布局Bean类数据获取MyAdapter类条目点击事件运行效果效果预览大概就是实现列表,列表中有诸多条


文章目录

  • 效果预览
  • 基本构架
    • activity_main.xml
    • 条目布局
    • Bean类
    • 数据获取
    • MyAdapter类
  • 条目点击事件
  • 运行效果


效果预览

大概就是实现列表,列表中有诸多条目且可以触发点击事件。
在这里插入图片描述


基本构架


activity_main.xml

直接在任意布局里创建一个ListView就好了,但这个时候徒有其形,其中的条目内容是默认的,也无法互动。


<LinearLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"android:layout_height&#61;"match_parent"android:layout_width&#61;"match_parent"android:orientation&#61;"vertical"><ListViewandroid:id&#61;"&#64;&#43;id/list"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"/>LinearLayout>

条目布局

列表中的条目称之为item&#xff0c;这些item也有自己的布局&#xff0c;我们需要在res->layout文件夹中为其创建布局资源item_layout.xml。其中为每个条目中的布局情况&#xff0c;这里演示比较简单&#xff0c;就用线性布局&#xff0c;组件就只有一个文本&#xff0c;设置其id为text


<LinearLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"android:orientation&#61;"vertical"><TextViewandroid:id&#61;"&#64;&#43;id/text"android:layout_width&#61;"wrap_content"android:layout_height&#61;"wrap_content"android:textSize&#61;"30sp"/>LinearLayout>

Bean类

一般来说&#xff0c;item中的数据需要从别的渠道获取&#xff08;比如联网&#xff09;&#xff0c;我们需要一个类来完成获取数据的操作&#xff0c;这个类就是Bean&#xff08;我也不知道为啥要叫这个名字&#xff09;。因为这里数据只有一个字符串&#xff0c;所以该类的成员变量只有一个String name&#xff0c;然后使用快捷键Alt&#43;Insert&#xff0c;选择Getter and Setter就可以快速补全代码。
在这里插入图片描述

package com.example.mylistview;public class Bean {String name;public String getName() {return name;}public void setName(String name) {this.name &#61; name;}
}

数据获取

因为还没有学联网&#xff0c;这里先本地自己造一些放进条目里的字符串&#xff0c;主要是演示一下怎么使用Bean类。

先声明一个Bean类型的列表用来装数据&#xff1a;

private List<Bean> data &#61; new ArrayList<>();

之后for循环&#xff0c;声明Bean类型的实例&#xff0c;设置其中的数据&#xff0c;然后存到列表里。

for(int i&#61;0;i<100;&#43;&#43;i){Bean bean &#61; new Bean();bean.setName("ShadyPi"&#43;i);data.add(bean);}

MyAdapter类

完成数据的获取之后&#xff0c;就需要将其放到ListView中&#xff0c;先通过findViewById找到我们的ListView&#xff0c;然后通过一个adapter将数据填充进去。

ListView list &#61; findViewById(R.id.list);list.setAdapter(new MyAdapter(data, this));

MyAdapter类继承自安卓提供的BaseAdapter类&#xff0c;使用Alt&#43;Enter就可以补全需要实现的四个方法的框架。分别是获取条目数量、获取Item、获取ItemID和获取View。

首先我们先把数据传入adapter中&#xff0c;这可以通过MyAdapter的构造方法来实现&#xff0c;分别传入data和context&#xff1a;

private List<Bean> data;private Context context;public MyAdapter(List<Bean> data, Context context) {this.data &#61; data;this.context &#61; context;}

而自动补全的几个方法也需要略改一下&#xff0c;比如说获取条目数量&#xff0c;我们需要返回data列表的大小&#xff1a;

&#64;Overridepublic int getCount() {return data.size();}

获取条目ID的时候我们直接返回i&#xff1a;

&#64;Overridepublic long getItemId(int i) {return i;}

而获取View就要复杂一些了&#xff0c;也是最关键的&#xff0c;每次在屏幕上显示某个item时都需要调用该函数。

改方法的逻辑是&#xff0c;当某个View之前没有被获取过时&#xff0c;新建一个viewHolder&#xff0c;该类是用来储存view中的信息的&#xff0c;防止重复findViewById&#xff0c;算是一个优化&#xff0c;该类的成员就是每个item中的组件&#xff0c;在这里就是一个TextView&#xff1a;

private final class ViewHolder{TextView textView;}

用viewHolder将数据存储起来&#xff0c;之后用setTag()将其添加到view上&#xff0c;然后用之前写好的条目布局item_layout渲染出一个View&#xff0c;将其放到view里&#xff1b;如果该view之前就被创建过&#xff0c;我们就用getTag()将之前添加的数据拿回viewHolder里。
最后&#xff0c;将对应条目的数据加载到viewHolder中&#xff0c;就完成了。

&#64;Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if(view &#61;&#61; null){viewHolder &#61; new ViewHolder();view &#61; LayoutInflater.from(context).inflate(R.layout.item_layout, viewGroup, false);viewHolder.textView &#61; view.findViewById(R.id.text);view.setTag(viewHolder);}else {viewHolder &#61; (ViewHolder) view.getTag();}//TextView textview &#61; view.findViewById(R.id.text);//textview.setText(data.get(i).getName());viewHolder.textView.setText(data.get(i).getName());Log.e("ShadyPi", "getView: "&#43;i);return view;}

条目点击事件

这个跟按钮点击差不多&#xff0c;在MainActivity.java中设置一个监听及其点击响应函数即可&#xff1a;

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {&#64;Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Log.e("ShadyPi", "click:"&#43;i);}});

运行效果

可以看到&#xff0c;随着屏幕滚动&#xff0c;条目不断被加载&#xff0c;一直在调用getView函数&#xff0c;而点击后响应事件也被触发了。
在这里插入图片描述


推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有