从这篇开始,总结一下 Android 中的一些复杂点的常用组件。
滚动视图: ScrollView
滚动视图的使用形式与各个布局管理器的操作形式类似,唯一不同的是,所有的布局管理器之中,可以包含多个组件,而滚动视图里只能有一个组件,所以所谓的视图指的就是提供一个专门的容器,这个容器里面可以装下多于屏幕宽度的组件,而后采用拖拽的方式显示所有 ScrollView 中的组件。
main.xml :
<?xml version="1.0" encoding="utf-8"?> <ScrollView android:id="@+id/myscroll" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/mylinear" android:layout_width="fill_parent" android:layout_height="fill_parent"> </LinearLayout> </ScrollView>
ScrollViewActivity.java:
package com.iflytek.activity; import android.app.Activity; import android.os.Bundle; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; public class ScrollViewActivity extends Activity { private String data[] = { "xdwang", "xdwangiflytek.iteye.com", "王旭东", "Java、C#、Android", "[email protected]", "[email protected]", "13956027313", "工作地点:安徽合肥", "家乡:安徽滁州","格言:打倒小日本","钓鱼岛属于中国" }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout layout = (LinearLayout) super.findViewById(R.id.mylinear); // 取得组件 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); // 定义布局参数 for (int x = 0; x < this.data.length; x++) { // 通过循环方式将以上的信息通过Button组件进行封装 Button but = new Button(this); but.setText(this.data[x]); // 设置显示文字 layout.addView(but, param); // 增加组件 } } }
列表显示: ListView
1 、基本功能实现 Demo
package com.iflytkek.activity; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class ListView01Activity extends Activity { private String data[] = { "xdwang", "xdwangiflytek.iteye.com", "王旭东", "Java、C#、Android", "[email protected]", "[email protected]", "13956027313", "工作地点:安徽合肥", "家乡:安徽滁州","格言:打倒小日本","钓鱼岛属于中国" }; private ListView listView = null; // 定义ListView组件 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.listView = new ListView(this); // 实例化组件 //simple_list_item_1,显示分风格 this.listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, this.data)); // 为ListView组件设置内容 super.setContentView(this.listView) ; // 显示组件 } }
2、SimpleAdapter
SimpleAdapter类主要功能是将List集合的数据转换为ListView可以支持的数据,而要想实现这种转换,首先需要定义一个数据的显示模版(专门定义一个布局管理器,基本上都是表格布局),在这个模版中可以定义ListView每行需要显示的所有组件,而在需要转换的List集合里保存的是多条Map集合的数据,这些Map集合里面保存着一些具体的要显示的信息,即:模版中每一个组件的ID实际上就相当于规定了里面保存的Map集合的key,而模版中每个组件的显示内容,则有Map保存的Value决定。这种操作也是ListView中操作最多的一种。
Layout/mian.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="25px" android:gravity="center_horizontal" android:text="王旭东信息列表" /> <ListView android:id="@+id/datalist" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>
Layout/data_list.xml
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow> <ImageView android:id="@+id/icon" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/file_icon"/> <TextView android:id="@+id/_id" android:textSize="15px" android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- 这边的id使用下划线的主要目的是为了以后在使用数据存储的时候SQLite数据库规定好必须使用一个下划线的id表示主键 --> <TextView android:id="@+id/name" android:textSize="15px" android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </TableRow> </TableLayout>
SimpleAdapterActivity.java:
package com.iflytek.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; public class SimpleAdapterActivity extends Activity { // 准备出若干个信息而这些信息以后将通过程序加入到内嵌的线性布局文件之中 private String data[][] = { { "001", "xdwang" }, { "002", "xdwangiflytek.iteye.com" }, { "003", "王旭东" }, { "004", "Java、C#、Android" }, { "005", "[email protected]" }, { "006", "[email protected]" }, { "007", "13956027313" }, { "008", "工作地点:安徽合肥" }, { "009", "家乡:安徽滁州" }, { "0010", "格言:打倒小日本" }, { "0011", "钓鱼岛属于中国" } }; private ListView datalist = null; // 定义ListView组件 private List<Map<String, String>> listMaps = new ArrayList<Map<String, String>>(); // 定义显示的内容包装 private SimpleAdapter simpleAdapter = null; // 进行数据的转换操作 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.datalist = (ListView) super.findViewById(R.id.datalist); // 取得组件 for (int x = 0; x < this.data.length; x++) { Map<String, String> map = new HashMap<String, String>(); // 定义Map集合,保存每一行数据 map.put("_id", this.data[x][0]); // 与data_list.xml中的TextView组加匹配 map.put("name", this.data[x][1]); // 与data_list.xml中的TextView组加匹配 this.listMaps.add(map); // 保存了所有的数据行 } this.simpleAdapter = new SimpleAdapter(this, this.listMaps, R.layout.data_list, new String[] { "_id", "name" } // Map中的key的名称 , new int[] { R.id._id, R.id.name }); // 是data_list.xml中定义的组件的资源ID this.datalist.setAdapter(this.simpleAdapter); } }
3、使用ListActivity
main.xml和data_list.xml和上面的不变
ListView04Activity.java:
package com.iflytek.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.ListActivity; import android.os.Bundle; import android.widget.SimpleAdapter; public class ListView04Activity extends ListActivity {// 继承了ListActivity类 private String data[][] = { { "001", "xdwang" }, { "002", "xdwangiflytek.iteye.com" }, { "003", "王旭东" }, { "004", "Java、C#、Android" }, { "005", "[email protected]" }, { "006", "[email protected]" }, { "007", "13956027313" }, { "008", "工作地点:安徽合肥" }, { "009", "家乡:安徽滁州" }, { "0010", "格言:打倒小日本" }, { "0011", "钓鱼岛属于中国" } }; private List<Map<String, String>> list = new ArrayList<Map<String, String>>(); // 定义显示的内容包装 private SimpleAdapter simpleAdapter = null; // 进行数据的转换操作 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for (int x = 0; x < this.data.length; x++) { Map<String, String> map = new HashMap<String, String>(); // 定义Map集合,保存每一行数据 map.put("_id", this.data[x][0]); // 与data_list.xml中的TextView组加匹配 map.put("name", this.data[x][1]); // 与data_list.xml中的TextView组加匹配 this.list.add(map); // 保存了所有的数据行 } this.simpleAdapter = new SimpleAdapter(this, this.list, R.layout.data_list, new String[] { "_id", "name" } // Map中的key的名称 , new int[] { R.id._id, R.id.name }); // 是data_list.xml中定义的组件的资源ID super.setListAdapter(this.simpleAdapter); // 设置列表显示 } }
此时没有使用到main.xml文件,而只是利用了data_list.xml文件进行显示,虽然说可以完成列表的功能,但是这种显示风格并不特别实用,没有之前定义ListView组件,而后利用Activity程序设置内容显示方便。
4、事件处理
main.xml和data_list.xml和上面的不变
ListView05Activity.java
package com.iflytek.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; public class ListView05Activity extends Activity { private String data[][] = { { "001", "xdwang" }, { "002", "xdwangiflytek.iteye.com" }, { "003", "王旭东" }, { "004", "Java、C#、Android" }, { "005", "[email protected]" }, { "006", "[email protected]" }, { "007", "13956027313" }, { "008", "工作地点:安徽合肥" }, { "009", "家乡:安徽滁州" }, { "0010", "格言:打倒小日本" }, { "0011", "钓鱼岛属于中国" } }; private ListView datalist = null; // 定义ListView组件 private List<Map<String, String>> list = new ArrayList<Map<String, String>>(); // 定义显示的内容包装 private SimpleAdapter simpleAdapter = null; // 进行数据的转换操作 private TextView info = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.datalist = (ListView) super.findViewById(R.id.datalist); // 取得组件 this.info = (TextView) super.findViewById(R.id.info); // 取得组件 for (int x = 0; x < this.data.length; x++) { Map<String, String> map = new HashMap<String, String>(); // 定义Map集合,保存每一行数据 map.put("_id", this.data[x][0]); // 与data_list.xml中的TextView组加匹配 map.put("name", this.data[x][1]); // 与data_list.xml中的TextView组加匹配 this.list.add(map); // 保存了所有的数据行 } this.simpleAdapter = new SimpleAdapter(this, this.list, R.layout.data_list, new String[] { "_id", "name" } // Map中的key的名称 , new int[] { R.id._id, R.id.name }); // 是data_list.xml中定义的组件的资源ID this.datalist.setAdapter(this.simpleAdapter); this.datalist.setOnItemClickListener(new OnItemClickListenerImpl()); // 单击选项 } private class OnItemClickListenerImpl implements OnItemClickListener { @SuppressWarnings("unchecked") @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String, String> map = (Map<String, String>) ListView05Activity.this.simpleAdapter .getItem(position); String _id = map.get("_id"); String name = map.get("name"); ListView05Activity.this.info.setText("选中的数据项ID是:" + _id + ",名称是:" + name); } } }
5、复杂显示
Main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="25px" android:gravity="center_horizontal" android:text="学习视频列表" /> <ListView android:id="@+id/datalist" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>
data_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/pic" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="3px"/> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="150px" android:layout_height="wrap_content" android:gravity="left"> <TextView android:id="@+id/title" android:textSize="16px" android:padding="3px" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/author" android:padding="3px" android:textSize="10px" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="200px" android:layout_height="wrap_content" android:gravity="left"> <TextView android:id="@+id/type" android:padding="3px" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/score" android:padding="3px" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
ListView03Activity.java:
package com.iflytek.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; public class ListView03Activity extends Activity { private int pic[] = new int[] { R.drawable.pic_oracle, R.drawable.pic_javase, R.drawable.pic_javaweb, R.drawable.pic_javaee, R.drawable.pic_android, R.drawable.pic_game }; private String data[][] = new String[][] { { "Oracle", "科大" }, { "Java SE", "小李" }, { "Java WEB", "花花" }, { "Java EE", "小王" }, { "Android", "乐乐" }, { "Java 游戏", "小三" } }; private ListView datalist = null; // 定义ListView组件 private List<Map<String, String>> list = new ArrayList<Map<String, String>>(); // 定义显示的内容包装 private SimpleAdapter simpleAdapter = null; // 进行数据的转换操作 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.datalist = (ListView) super.findViewById(R.id.datalist); // 取得组件 for (int x = 0; x < this.data.length; x++) { Map<String, String> map = new HashMap<String, String>(); // 定义Map集合,保存每一行数据 map.put("pic", String.valueOf(this.pic[x])); // 与data_list.xml中的TextView组加匹配 map.put("title", this.data[x][0]); // 与data_list.xml中的TextView组加匹配 map.put("author", this.data[x][1]); // 与data_list.xml中的TextView组加匹配 map.put("type", "免费"); map.put("score", String.valueOf(R.drawable.start_05)); this.list.add(map); // 保存了所有的数据行 } this.simpleAdapter = new SimpleAdapter(this, this.list, R.layout.data_list, new String[] { "pic", "title", "author", "type", "score" } // Map中的key的名称 , new int[] { R.id.pic, R.id.title, R.id.author, R.id.type, R.id.score }); // 是data_list.xml中定义的组件的资源ID this.datalist.setAdapter(this.simpleAdapter); } }