作者: | 来源:互联网 | 2023-09-15 17:38
文章目录效果预览基本构架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;Override public int getCount ( ) { return data. size ( ) ; }
获取条目ID的时候我们直接返回i&#xff1a;
&#64;Override public 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;Override public 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 ( ) ; } 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;Override public void onItemClick ( AdapterView< ? > adapterView, View view, int i, long l) { Log. e ( "ShadyPi" , "click:" &#43; i) ; } } ) ;
运行效果 可以看到&#xff0c;随着屏幕滚动&#xff0c;条目不断被加载&#xff0c;一直在调用getView
函数&#xff0c;而点击后响应事件也被触发了。