1.ListView
1.1ListView简介
1.简介:就是一个列表控件。方便展示数据,并可以独立的为各行的元素设置监听器。每一行可以是一个独立的元素也可以是一个字符串,也可以是一个组合控件。
真正的数据在Adapter中,View只负责数据的更新和显示。
2.常见的属性?
-
entiires设置的是数组资源,用xml表示
-
divider,设置list列表项的分割条
-
dividerHight,设置分割条的宽度
1.2ListView的创建
1.创建的方式有两种?
第一种:使用values下的资源
-
直接ListView创建
-
直接使用资源文件给出列表项
-
使用适配器给出列表项
第二种:继承ListActivity
2.案例:
第一种:创建方式创建ListView
第一步:values下创建数组。books。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="books">
<item>Java面向对象</item>
<item>数据结构</item>
<item>操作系统</item>
<item>Javaweb</item>
</string-array>
</resources>
第二步:创建布局文件
<!--设置布局-->
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/books"
/>
效果图:
第二种:使用activity创建。适配器去提供数据。
数据->适配器->数据
适配器是数据和视图之间的桥梁
第一步:创建布局文件
<ListView
android:id="@+id/listview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
第二步:创建适配器
public ArrayAdapter (Context context, int resource, T[] objects)
-
参数1:上下文
-
参数2:每一行列表项TextView的样式。安卓中提供了一些布局样式,或者自定义一个TextView的布局样式。
-
simple_list_item_1:每个列表项都是一个普通的textView
-
simple_list_item_2:每个列表项都是一个普通的
-
textView(字体略大)
-
simple_list_item_checked:每个列表项都是一个已勾选的列表项
-
simple_list_item_multiple_choice:每个列表项都是带多选框的文本
-
simple_list_item_single_choice:每个列表项都是带单选框的文本
-
-
参数3:数据源(数组或者是集合)
// 获取ListView对象
ListView listView=findViewById(R.id.listview1);
String citys[]={"北京","上海","天津","济南","日照"};
ArrayAdapter adapter=new ArrayAdapter(this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,citys);
listView.setAdapter(adapter);
第三种:
如果说程序的窗口只需要显示一个列表的话,可以直接让Activity继承ListActivity就行不用去写setContentView方法。说明这个布局是一个简单的布局文件。
一个ListActivity必须包含一个ListView。可以通过this.getListView去获取ListBiew对象。
第一步:创建一个activity实现ListActivity接口
实现ListActivity类的布局是一个系统默认存在的不需要用户去设置的一个布局,默认显示的就是列表控件布局。
案例:显示几个大学的名称。
//用ListView接口实现的ListView
public class ListactivityActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_listactivity);
String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"};
ArrayAdapter adapter=new ArrayAdapter(this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,str);
this.setListAdapter(adapter);
}
}
效果图:
第四种:继承ListActivity的同时可以指定自定义的列表项的布局
第一步:layout下创建一个新的布局文件array_item
-
设置了一个id
-
宽度和高度
-
字体的大小
-
内容和控件之间的距离
-
阴影的颜色
-
阴影的伸展范围
-
控件内部元素居中显示
-
文字的颜色
-
typeface设置的是文字的字体
注意:此时定义的只是列表空间的显示效果与具体的数据是没有关系的
原先设置的样式都系统中自带的,现在设置的都是自定义的样式
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:padding="10dp"
android:shadowColor="#f0f"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2"
android:typeface="serif"
android:gravity="center"
android:textColor="#000000"
/>
第二步:创建activity。我直接用的上面的案例那个。
String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"}; // 此时第二个参数引用的就是我们当前布局文件的样式(只是引用了样式,并没有设置其他的内容) ArrayAdapter adapter=new ArrayAdapter(this, R.layout.array_item,str); this.setListAdapter(adapter);
效果图:
第五种:继承ListActivity的同时,使用自定义的xml布局文件。需要在布局文件中创建一个id是
第一步:在activity对应的布局文件中创建一个ListView的控件。
出现错误的话推荐阅读博客:使用android时出现"无法解析符号"错误:id ="@ + android:id/my_id" |
@+id/是创建自己的id
@id/是使用自已已经创建的id
@android:id/使用的是系统创建的id
<LinearLayout 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:orientation="vertical"
>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/black"
android:dividerHeight="5dp"
/>
</LinearLayout>
第二步:编写activity控件。需要继承ListActivity。
这里面需要设置setContentView(R.layout.activity_listactivity);
setContentView(R.layout.activity_listactivity);
String str[]={"北京大学","山东大学","清华大学","南京大学","天津大学"};
// 此时第二个参数引用的就是我们当前布局文件的样式(只是引用了样式,并没有设置其他的内容)
ArrayAdapter adapter=new ArrayAdapter(this, R.layout.array_item,str);
this.setListAdapter(adapter);
效果图:
3.总结
虽然,实现ListActivity的方式很方便,但是对于复杂的列表项的实现不行的。需要用SimpleAdapter去实现。
1.3使用SimpleAdapter创建ListView
1.优点:可以显示复杂的列表项。例如,图片。
2.构造函数:
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {...}
-
第一个参数:就是当前的activity,传入this就可以。
-
第二个参数:List集合对象,但是集合中的元素都是Map集合的形式。每一个Map就是一个列表项。
-
第三个参数:指定一个布局文件的id。也就是当前的列表项用的是哪个布局文件。
-
第四个参数:Map集合中的主键集合。表示的是当前的ListView有几列(里面需要填入的是列的名字)。
-
第五个参数:就是第三个参数中的布局文件中需要显示的控件的id。注意,需要和第四个参数进行一一对应起来。
1.3.1使用SimpleAdapter创建ListView
1.每一行的列表项对应一个Map。一个ListView其实就是一个List。其实最终就是把每一个map放到ListView中去。
2.案例:使用SimpleAdapter创建ListView
效果图:
第一步:创建主布局文件.activity_simpleadapter.xml
主布局文件里面放置的是一个ListView和一个TextView用于显示内容的
<?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="wrap_content"
android:orientation="vertical"
>
<!-- 用于显示用户的信息 -->
<ListView
android:id="@+id/mylist"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- 用于显示当前选中的是哪一列的用户-->
<TextView
android:id="@+id/txtResult"
android:textSize="30dp"
android:text="请选择:"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
第二步:创建子项目的布局文件.test.xml
子项目的布局文件名字起的很随意
<?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">
<ImageView
android:maxHeight="20dp"
android:maxWidth="20dp"
android:adjustViewBounds="true"
android:id="@+id/header"
android:layout_width="wrap_content"
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>
第三步:找几张图片放到mopmap中去
找的图片是im1-img4,全是png的图片
第四步:编写activity文件,并设置监听.SimpleadapterActivityjava
//用SimpleAdapter实现列表项
public class SimpleadapterActivity extends AppCompatActivity {
//初始化对象
private String[] names={"张三","李四","王五","赵六"};
private String[] desc={"帅气","聪明","灵力","优秀"};
//头像的id
private int[] imageId={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
//当前选中的结果
TextView txetResult=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simpleadapter);
// 获取布局文件中的对象
txetResult=findViewById(R.id.txtResult);
// 创建一个List集合,集合中的元素是map
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
// 初始化集合中的元素
for (int i = 0; i < names.length; i++) {
Map<String,Object> listItem=new HashMap<String,Object>();
// 放入头像
listItem.put("header",imageId[i]);
// 放入姓名
listItem.put("username",names[i]);
// 放入个人的描述
listItem.put("desc",desc[i]);
// 将map存到list集合中去
list.add(listItem);
}
// 创建一个SimpleAdapter
// 这里传入的是R.layout.test
// 第三个参数指定的是子项的布局文件
SimpleAdapter simpleAdapter=new SimpleAdapter(this,list,R.layout.test,new String[]{"header","username","desc"},new int[] {R.id.header,R.id.username,R.id.desc});
// 创建ListView
ListView listView=findViewById(R.id.mylist);
// 给listview设置SimpleAdapter
listView.setAdapter(simpleAdapter);
// 给当前的listView设置监听事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// 第
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view就是被点击的item对象
// 这里的要用view去获取子布局文件中的元素内的内容
TextView username=(TextView)view.findViewById(R.id.username);
TextView descs=(TextView)view.findViewById(R.id.desc);
// Log.d(TAG, ((TextView) view.findViewById(R.id.username)).getText().toString());
// Log.d(TAG, names[position]);
// 拼接要显示的内容
txetResult.setText("当前选中的是:"+username.getText().toString()+"---个人简介是:"+descs.getText().toString());
Toast.makeText(SimpleadapterActivity.this,"当前您点击的是 name:"+username.getText().toString()+"个人简介是:"+descs.getText().toString() , Toast.LENGTH_SHORT).show();
}
});
}
}
推荐阅读:Android之旅第四站——Simpleapter的使用…_Li_peilun的博客-CSDN博客
1.3.2ListView的事件监听
1.setOnItemClickListener用于设置事件的监听,监听在点击改项目的子项目的时候触发。
需要实现public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}方法。
-
第一个参数,被点击的列表项属于哪一个ListView
-
第二个参数:被点击的item对象
-
第三个参数,int position,被点击的item对象的位置
-
第四个参数,被点击的item对象的id
2.setItemLongClickListener,长事件的监听
3.OnTouchListener,监听器在触碰到ListView时触发
4.OnScrollListener,监听器在ListView滚动的时候触发
1.4BaseAdapter案例的实现
简单投票案例的实现:
效果图:
投票案例代码,下期更新!