ListView学习
ListView是什么?
listview是一套视图组件。
ListView通常以列表的形式在android客户端显示一些列表选项。
ListView应用场合?
淘宝客户端、微信、新闻。
ListView构成分析?
ListView是一个容器,ListView中包含Item,每个Item承载数据
ListView 实现分析
本身是一个容器
会有很多列表项
Adapter应用分析?
ListView从Adapter中提取数据,Adapter加载界面,读取所需要的数据。
把数据跟加载出来的界面对象组建成一个View Item,返回给ListView,对一个ListView来说
,最重要的是Adapter。
实现步骤
创建ListView布局
创建Item布局
获取数据
创建适配器
为ListView控件设置适配器
ArrayAdapter
ArrayAdapter
最简单的适配器,用于为ListView提供承载简单数据的Item界面
其数据源必须是数组或简单的List集合
其加载的Item布局中必须包含至少一个TextView控件,数据源中的数据将逐条显示在
每一个ItemView的TextView控件中
ArrayAdapter
ArrayAdapter的构造方法
ArrayAdapter<T>(Context context,int layoutRes)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId)
ArrayAdapter<T>(Context context,List<T> data)
ArrayAdapter<T>(Context context,int layoutRes,T[] data)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,T[] data)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,List<T> data)
ArrayAdapter的静态方法
Publicstatic ArrayAdaptercreateFromResource(Context context,int layoutRes,int textViewRes)
SimpleAdapter
SimpleAdapter
一种简单的通用适配器
其数据源必须是由结构相同的Map集合构成的List集合
每个Map中的数据将被显示在一个Item中,所以必须为Item
中的每个控件指定该控件对应显示的值是map集合中的哪个值。
SimpleAdapter的构造方法
SimpleAdapter(Context context,List<? extends Map<String,?>>data,int layoutRes,String[] from,int[] to)
data:数据集,必须是由结构相同的map集合构成的List集合。
layoutRes:item的布局资源id
from:map集合中的key构成的数组
to:item布局中的控件id构成的数组。
item.xml
适配器:
数据处理:
布局:
listview是一套视图组件。
ListView通常以列表的形式在android客户端显示一些列表选项。
ListView应用场合?
淘宝客户端、微信、新闻。
ListView构成分析?
ListView是一个容器,ListView中包含Item,每个Item承载数据
ListView 实现分析
本身是一个容器
会有很多列表项
Adapter应用分析?
ListView从Adapter中提取数据,Adapter加载界面,读取所需要的数据。
把数据跟加载出来的界面对象组建成一个View Item,返回给ListView,对一个ListView来说
,最重要的是Adapter。
实现步骤
创建ListView布局
创建Item布局
获取数据
创建适配器
为ListView控件设置适配器
ArrayAdapter
ArrayAdapter
最简单的适配器,用于为ListView提供承载简单数据的Item界面
其数据源必须是数组或简单的List集合
其加载的Item布局中必须包含至少一个TextView控件,数据源中的数据将逐条显示在
每一个ItemView的TextView控件中
ArrayAdapter
ArrayAdapter的构造方法
ArrayAdapter<T>(Context context,int layoutRes)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId)
ArrayAdapter<T>(Context context,List<T> data)
ArrayAdapter<T>(Context context,int layoutRes,T[] data)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,T[] data)
ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,List<T> data)
ArrayAdapter的静态方法
Publicstatic ArrayAdaptercreateFromResource(Context context,int layoutRes,int textViewRes)
SimpleAdapter
SimpleAdapter
一种简单的通用适配器
其数据源必须是由结构相同的Map集合构成的List集合
每个Map中的数据将被显示在一个Item中,所以必须为Item
中的每个控件指定该控件对应显示的值是map集合中的哪个值。
SimpleAdapter的构造方法
SimpleAdapter(Context context,List<? extends Map<String,?>>data,int layoutRes,String[] from,int[] to)
data:数据集,必须是由结构相同的map集合构成的List集合。
layoutRes:item的布局资源id
from:map集合中的key构成的数组
to:item布局中的控件id构成的数组。
from和to两个参数存在对应关系,其含义是map集合中指定key值,存储在对应的id控件中
小案例:
布局:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lvFriends"
/>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="20sp"
android:textColor="#FFFF0000" >
</TextView>
适配器:
package com.example.listview;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lvFriends;
private ArrayAdapter<String> adapter;
private void setupView(){
lvFriends = (ListView) findViewById(R.id.lvFriends);
String[] friends = {"关羽","赵云","张飞","马超","黄忠"};
adapter = new ArrayAdapter<String>(this,R.layout.item,friends);
lvFriends.setAdapter(adapter);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
}
}
SimpleAdapter实现的一个小项目:
显示图片跟字体:
界面布局:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lvFriends"
/>
item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<ImageView
android:id="@+id/ivHead"
android:layout_width="64dp"
android:layout_height="64dp"/>
<TextView
android:id="@+id/tvName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="30sp"
android:layout_weight="1.0"
android:layout_marginLeft="20dp"/>
</LinearLayout>
类:
package com.example.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class DataSource {
public static List<HashMap<String,Object>>getData(){
List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> item = new HashMap<String,Object>();
item.put("photo_id", R.drawable.ic_launcher);
item.put("name", "关羽");
data.add(item);
item = new HashMap<String,Object>();
item.put("photo_id", R.drawable.image);
item.put("name", "张飞");
data.add(item);
item = new HashMap<String,Object>();
item.put("photo_id", R.drawable.image);
item.put("name", "黄忠");
data.add(item);
item = new HashMap<String,Object>();
item.put("photo_id", R.drawable.ic_launcher);
item.put("name", "赵云");
data.add(item);
item = new HashMap<String,Object>();
item.put("photo_id", R.drawable.image);
item.put("name", "魏延");
data.add(item);
return data;
}
}
主界面:
package com.example.listview;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
private ListView lvFriends;
private SimpleAdapter adapter;
private void setupView(){
lvFriends = (ListView) findViewById(R.id.lvFriends);
List<HashMap<String ,Object>> data = DataSource.getData();
String[] from = {"photo_id","name"};
int[] to = {R.id.ivHead,R.id.tvName};
adapter = new SimpleAdapter(this,data, R.layout.item, from, to);
lvFriends.setAdapter(adapter);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
}
}
Listview的懒加载模式:
ListView滚动懒加载模式
要点
为自定义适配器,添加boolean型控制变量,用于控制是否加载数据
为ListView添加滚动事件监听器
在onScrollStateChanged方法中,判断当前的滚动状态,并设置到adapter中的控制变量
要点
为自定义适配器,添加boolean型控制变量,用于控制是否加载数据
为ListView添加滚动事件监听器
在onScrollStateChanged方法中,判断当前的滚动状态,并设置到adapter中的控制变量
主Activity:
package com.example.listview1;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lvMusics;
private MusicAdapter adapter;
private int page;
private AlertDialog dialog;
private void setupView(){
lvMusics = (ListView) findViewById(R.id.lvMusics);
page = 1;
adapter = new MusicAdapter(this, MusicBiz.getMusics(page++));
lvMusics.setAdapter(adapter);
}
private void addListener(){
lvMusics.setOnScrollListener(new OnScrollListener() {
private int lastVisibleItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
adapter.setIdle(true);
adapter.notifyDataSetChanged();
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
case OnScrollListener.SCROLL_STATE_FLING:
adapter.setIdle(false);
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
addListener();
}
}
对象:
package com.example.listview1;
public class Music {
private String name;
private String album;
private int id;
private String duration;
private String artist;
private String musicPath;
private String albumPicPath;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getMusicPath() {
return musicPath;
}
public void setMusicPath(String musicPath) {
this.musicPath = musicPath;
}
public String getAlbumPicPath() {
return albumPicPath;
}
public void setAlbumPicPath(String albumPicPath) {
this.albumPicPath = albumPicPath;
}
public String toString(){
return "Music [id=" + id +
",name=" + name + ",album=" + album +
",duration=" + duration + ",artist=" + artist +
",musicPath=" + musicPath + ",albumPicPath="
+ albumPicPath + "]";
}
}
package com.example.listview1;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MusicAdapter extends BaseAdapter {
private ArrayList<Music> musics;
private LayoutInflater inflater;
private boolean isIdle;
public void setIdle(boolean isIdle) {
this.isIdle = isIdle;
}
public MusicAdapter(Context context,ArrayList<Music> musics) {
if(musics != null)
this.musics = musics;
else
this.musics = new ArrayList<Music>();
this.inflater = LayoutInflater.from(context);
}
public void addData(ArrayList<Music> musics){
if(musics != null){
this.musics.addAll(musics);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return musics.size();
}
@Override
public Music getItem(int position) {
// TODO Auto-generated method stub
return musics.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return getItem(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.tvName = (TextView)convertView.findViewById(R.id.tvName);
holder.tvAlbum = (TextView)convertView.findViewById(R.id.tvAlbum);
holder.tvArtist = (TextView)convertView.findViewById(R.id.tvArtist);
holder.tvDuration = (TextView)convertView.findViewById(R.id.tvDuration);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
if(isIdle){
Music m = musics.get(position);
holder.tvName.setText(m.getName());
holder.tvAlbum.setText(m.getAlbum());
holder.tvArtist.setText(m.getArtist());
holder.tvDuration.setText(m.getDuration());
}
return convertView;
}
class ViewHolder{
private TextView tvName;
private TextView tvDuration;
private TextView tvArtist;
private TextView tvAlbum;
}
}
数据处理:
package com.example.listview1;
import java.util.ArrayList;
public class MusicBiz {
public static ArrayList<Music> getMusics(int page){
ArrayList<Music> musics = new ArrayList<Music>();
int i=(page - 1) * 20 +1;
int end = i+20;
for(;i<end;i++){
Music m = new Music();
m.setId(i);
m.setName("歌曲" + i);
m.setAlbum("专辑" + i);
m.setAlbumPicPath("D:/www.123/123/1.jpg");
m.setDuration("14:23");
m.setArtist("陈奕迅");
m.setMusicPath("http://www.123wer/123/music.jpg");
musics.add(m);
}
return musics;
}
}
布局:
<ListView
android:id="@+id/lvMusics"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
/>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/image"/>
<TableLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:stretchColumns="*">
<TableRow
android:layout_height="0dp"
android:layout_weight="1.0">
<TextView
android:id="@+id/tvName"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="20sp"/>
<TextView
android:id="@+id/tvDuration"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="20sp"/>
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight="1.0">
<TextView
android:id="@+id/tvArtist"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="20sp"/>
<TextView
android:id="@+id/tvAlbum"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="20sp"/>
</TableRow>
</TableLayout>
</LinearLayout>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理