ListView案例集锦
1.ArrayAdapter的创建方式
1.构造函数简介
public ArrayAdapter (Context context, int resource, T[] objects)
- 上下文,就是当前的Java文件
- 资源文件,就是每一个子项(每一行)的布局,比如当个的textView,带多选框的,带复选框的等等
- 数据源,数组或者是集合
常见的小布局:
- 前面统一写:android.R.layout.
simplelistitem1:每个列表项都是一个普通的textView
simplelistitem2:每个列表项都是一个普通的textView(字体略大)
simplelistitemchecked:每个列表项都是一个已勾选的列表项
simplelistitemmultiplechoice:每个列表项都是带多选框的文本
simplelistitemsingle_choice:每个列表项都是带单选框的文本
1.1数组当数据源
第一步:编写布局文件
<!-- 数组当数据源-->
<ListView
android:id="@+id/mybooks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@mipmap/blue"
android:dividerHeight="10dp"
/>
第二步:创建数组数据,编写Java中的适配器
注意子项的布局文件开始要从android包开始导入。
第三步:绑定适配器
public class Listviewdemoactivity2Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listviewdemoactivity2);
// 第一步:获取布局文件中的ListView
ListView listView=findViewById(R.id.mybooks);
// 第二步:创建数据源
String[] books={"Java" ,"数据结构","大学计算机","专业英语","Vue速成"};
// 第三步:创建ArrayAdapter,传入数据
// 注意一个小小的问题,从系统中导入子项的布局文件的样式要从安卓的包开始写
ArrayAdapter<String> adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,books);
// 第四步:绑定适配器
listView.setAdapter(adapter);
}
}
效果图:
1.2集合当数据源
创建方式只需要把1.1的数组变成集合的形式就可以了。
public class Listviewdemoactivity2Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listviewdemoactivity2);
// 第二种:采用集合中的数据
// 第一步:获取布局文件中的ListView
ListView listView=findViewById(R.id.mybooks);
// 第二步:创建数据源
List<String> colthes=new ArrayList<String>();
colthes.add("褂子");
colthes.add("裤子");
colthes.add("鞋子");
colthes.add("袜子");
// 第三步:创建ArrayAdapter,传入数据
// 注意一个小小的问题,从系统中导入子项的布局文件的样式要从安卓的包开始写
ArrayAdapter<String> adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,colthes);
// 第四步:绑定适配器
listView.setAdapter(adapter);
}
}
效果图:
2.entries引入资源文件的方式
1.这种方式的好处是不用写Java文件。直接写布局文件就可以了。布局文件如下。
第一步:先去values中的string文件中建立一个phone的数组。
- name指定的名字就是要引入的数组。
<resources>
<string name="app_name">shiyan1</string>
<!--设置一个手机数组-->
<string-array name="phone">
<item>苹果</item>
<item>华为</item>
<item>小米</item>
</string-array>
</resources>
第二步:mipmap中导入我们需要的分割线的图片。
- 导入了一个blue.png
第三步:编写布局文件。
- 设置分割线
- 设置分割线的高度
- entries引入我们第一步创建的数组
注意:此时数组中@array/数组名称,而不是我们的string。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Listviewdemoactivity2Activity">
<!--采用布局的方式进行创建-->
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/phone"
android:divider="@mipmap/blue"
android:dividerHeight="10dp"
></ListView>
</LinearLayout>
第四步:设置成主启动类。
<activity
android:name=".Listviewdemoactivity2Activity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
效果图:
3.采用SimpleAdapter的创建方式
为什么需要引入SimpleAdapter,原先的ArrayAdapter一行中只允许创建一个简单的子项,原先的子项的布局方式都是系统指定的。而现在的子项的布局方式并不是引入系统的而是我们自己去指定的,所以可以实现非常强大的布局。
1.构造函数
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to)
- 上下文
- List代表的是整个ListView要显示的数据,Map代表的是每个子项需要显示的内容
- Map中键的集合
- 子项布局文件中的id,需要和参数进行一一的对应的
2.创建一个如下图所示的案例:
效果图:
第一步:创建一个父布局文件,写入一个Listview
<!--设置父布局-->
<ListView
android:id="@+id/mypeople"
android:layout_width="match_parent"
android:layout_height="wrap_content"
></ListView>
<!-- 设置要显示的内容-->
<TextView
android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="当前选中的是:"
android:textSize="30dp"
/>
第二步:创建一个子布局文件。命名为mylistpeople
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<ImageView
android:maxHeight="20dp"
android:maxWidth="20dp"
android:adjustViewBounds="true"
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
第三步:去第一步创建的布局文件对应的activity进行编写SimpleAdapter的代码
- 先往maimap中导入四张头像的图片im3.png,im4.png,im2.png,im1.png
public class SimpleadapterdemoActivity extends AppCompatActivity {
//创建数据
private int header[]={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
private String username[]={"张三","李四","王五","赵六"};
private String[] desc={"帅气","聪明","灵力","优秀"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simpleadapterdemo);
// 第一步:获取ListView对象
ListView listView=findViewById(R.id.mypeople);
// 第二步:创建数据
List<Map<String,Object>> mapList=new ArrayList<Map<String,Object>>();
// 第三步:初始化List集合
for (int i = 0; i < 4; i++) {
Map<String,Object> map=new HashMap<String,Object>();
map.put("header",header[i]);
map.put("username",username[i]);
map.put("desc",desc[i]);
mapList.add(map);
}
// 第四步:创建一个SimpleAdapter
SimpleAdapter simpleAdapter=new SimpleAdapter(this,mapList,R.layout.mylistpeople,new String[]{"header","username","desc"},new int[]{R.id.header,R.id.username,R.id.desc});
// 第五步:绑定适配器
listView.setAdapter(simpleAdapter);
}
}
此时创建的是没有设置监听器的,但是效果是有的:
第四步:设置监听器,将选中的信息动态的显示在下面
public class SimpleadapterdemoActivity extends AppCompatActivity {
//创建数据
private int header[]={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
private String username[]={"张三","李四","王五","赵六"};
private String[] desc={"帅气","聪明","灵力","优秀"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simpleadapterdemo);
// 第一步:获取ListView对象
ListView listView=findViewById(R.id.mypeople);
// 第二步:创建数据
List<Map<String,Object>> mapList=new ArrayList<Map<String,Object>>();
// 第三步:初始化List集合
for (int i = 0; i < 4; i++) {
Map<String,Object> map=new HashMap<String,Object>();
map.put("header",header[i]);
map.put("username",username[i]);
map.put("desc",desc[i]);
mapList.add(map);
}
// 第四步:创建一个SimpleAdapter
SimpleAdapter simpleAdapter=new SimpleAdapter(this,mapList,R.layout.mylistpeople,new String[]{"header","username","desc"},new int[]{R.id.header,R.id.username,R.id.desc});
// 补充:设置监听器
// ListView中要显示的结果:
TextView textView=this.findViewById(R.id.result);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView name=(TextView) view.findViewById(R.id.username);
TextView desc=(TextView) view.findViewById(R.id.desc);
// 设置textView区域显示的内容
// 一定要getText才能获取当前的文本,需要toString才能转换成文本
String result="当前选中的是:"+name.getText().toString()+"个人简介是:"+desc.getText().toString();
textView.setText(result);
// 弹出提示的内容
Toast toast=Toast.makeText(SimpleadapterdemoActivity.this, result, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
});
// 第五步:绑定适配器
listView.setAdapter(simpleAdapter);
}
}
完整的效果图:
3.1监听器
1.监听的方法。OnItemClickListener。
设置监听器的方法目的是为了做SimpleAdapter的案例的。
该监听器只有在点击子项目的时候才会进行触发的。
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}
- parent获取的是整个ListView要显示的东西。parent就是一个ListView对象(强制转换)。
- view,可以通过getText获取当前控件中的文字
- position,当前的子项目所在的位置
- id,和position相同
可以通过parent进行数据的获取的。先强制转换成我们的ListView对象,再去获取adapter对象。获取ListAdapter对象后再去获取Model对象。
ListView listView = (ListView) parent;
ListAdapter listAdapter = listView.getAdapter();
SelfModel selfModel = (SelfModel) listAdapter.getItem(position);