2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
来源:互联网 发布:彩虹无人机 知乎 编辑:程序博客网 时间:2024/06/06 02:31
- 列表视图(ListView)和ListActivity
①直接使用ListView创建
②让Activity继承ListActivity(相当于该activity显示的组件为ListView)
提示:ListView、GridView、Spinner、Galley等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。
AbsListView的常用属性和相关方法见下表:
属性
相关方法
说明
android:choiceMode设置AbsListView的选择方式:
none:不显示任何选中项
singleChoice:允许单选
multipleChoice:允许多选
multipleChoiceModal:允许多选
android:drawSelectorOnTopsetDrawSelectorOnTop(boolean)如果该属性设置为true,选中的列表项将会显示在上面android:fastScrollEnabled 设置是否允许快速滚动。如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。android:listSelectorsetSelector(int)指定被选中的列表项上绘制的Drawableandroid:scrollingCache 如果设置为true,则在滚动时将会使用缓存android:smoothScrollbarsetSmoothScrollbarEnabled(boolean)如果设置为false,则不在header View之后绘制分隔条android:stackFromBottom 设置是否从底端开始排列列表项android:textFilterEnabled 设置是否对列表项进行过滤。只有当该AdapterView对应的Adapter实现了Filter接口时该属性才会作用。android:transcriptMode 设置组件的滚动模式:disabled:关闭滚动(默认)
normal:当该AbsListView收到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端。
alwaysScroll:该AbsListView总会自动滚动到底端
ListView提供的属性如下表:
属性
说明
android:divider设置List列表项的分隔条(可用颜色分隔,也可用drawable对象分隔)android:dividerHeiht设置分隔条的高度android:entries指定一个数组资源,Android将根据该数组资源来生成ListViewandroid:footerDividerEnabled如果设置成false,则不在footer View之前绘制分隔条andorid:headerDividerEnabled如果设置成false,则不再header View之前绘制分隔条- Adapter接口及实现类
ArrayAdapter(列表项只能是TextView)
①布局文件里:
<ListView
...
android:id="@+id/listview"
/>
②Java段内需要一个数组或者list集合
③//将数组包装为ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.array_item, array);
参数:Context, TextViewResourceId(布局文件,里面包含一个TextView,自己设置显示的格式), 数组或list
ListActivity
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 无须使用布局文件 setContentView()
String[] arr = { "孙悟空", "猪八戒", "唐僧" };
// 创建ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, arr);
// 设置该窗口显示列表
setListAdapter(adapter); 0000000
}
}
SimpleAdapter(更复杂的列表项使用SimpleAdapter)
public class MainActivity extends Activity {
private String[] names = new String[]
{ "虎头", "弄玉", "李清照", "李白"};
private String[] descs = new String[]
{ "可爱的小孩", "一个擅长音乐的女孩"
, "一个擅长文学的女性", "浪漫主义诗人"};
private int[] imageIds = new int[]
{ R.drawable.tiger , R.drawable.nongyu
, R.drawable.qingzhao , R.drawable.libai};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //main.xml布局里面有一个ListView项, id=mylist
// 创建一个List集合,List集合的元素是Map
List<Map<String, Object>> listItems =
new ArrayList<Map<String, Object>>();
//添加数据到集合中
for (int i = 0; i < names.length; i++) {
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("header", imageIds[i]);
listItem.put("personName", names[i]);
listItem.put("desc", descs[i]);
listItems.add(listItem);
}
// 创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
R.layout.simple_item,
.
new String[] { "personName", "header" , "desc"},
new int[] { R.id.name, R.id.header , R.id.desc });
参数: 第2个:List<Map<String, Object>>
第3个:simple_item布局里面就是图片和两句文字的具体显示
第4个:String[] 是Map<String, ?>里面的key
第5个:int[]决定填充哪些组件---simple_item布局里面图片和文字对应的id
ListView mylist = (ListView) findViewById(R.id.mylist);
// 为ListView设置Adapter
mylist.setAdapter(simpleAdapter);
// 为ListView的列表项的单击事件绑定事件监听器
list.setOnItemClickListener(new OnItemClickListener() {
// 第position项被单击时激发该方法
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
System.out.println(names[position]
+ "被单击了");
}
});
// 为ListView的列表项的选中事件绑定事件监听器
list.setOnItemSelectedListener(new OnItemSelectedListener()
{
// 第position项被选中时激发该方法
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
System.out.println(names[position]
+ "被选中了");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
扩展BaseAdapter实现不存储列表项的ListView
public class MainActivity extends Activity {
ListView myList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myList = (ListView) findViewById(R.id.myList); //main.xml中ListView项的ID
BaseAdapteradapter = new BaseAdapter() {
@Override
publicint getCount() {
// 返回值控制该Adapter将会包含多少个列表项
// 指定一共包含40个选项
return 40;
}
@Override
publicObject getItem(int position) {
// 返回值决定第position处的列表项的内容
return null;
}
@Override
publiclong getItemId(int position) {
// 返回值将作为列表项的ID
return position;
}
@Override
publicView getView(int position
, View convertView , ViewGroup parent) {
// 返回的View将作为列表框
LinearLayout line =new LinearLayout(MainActivity.this);
line.setOrientation(0);
ImageView image =new ImageView(MainActivity.this);
image.setImageResource(R.drawable.ic_launcher);
TextView text =new TextView(MainActivity.this);
text.setText("第" + (position +1 ) + "个列表项");
text.setTextSize(20);
text.setTextColor(Color.RED);
line.addView(image);
line.addView(text);
// 返回LinearLayout实例
return line;
}
};
myList.setAdapter(adapter);
}
}
- 自动完成文本框(AutoCompleteTextView)的功能及用法
从EditText派生而出,实际上它也是一个文本编辑框。当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户选择,然后自动填写该文本框。
其还派生出一个子类:MultiAutoCompleteTextView(允许输入多个提示项)
main.xml
<!-- 定义一个自动完成文本框,
指定输入一个字符后进行提示 -->
<AutoCompleteTextView
android:id="@+id/auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionHint="请选择您喜欢的图书:" <!--设置下拉菜单中的提示标题-->
android:dropDownHorizontalOffset="10dp" <!--下拉菜单与文本框之间的水平偏移-->
android:completionThreshold="1"/> <!--设置用户至少输入几个字符才会显示提示-->
<!-- 定义一个MultiAutoCompleteTextView组件 -->
<MultiAutoCompleteTextView
android:id="@+id/mauto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1"/>
MainActivity.java
public class MainActivity extends Activity {
AutoCompleteTextView actv;
MultiAutoCompleteTextView mauto;
// 定义字符串数组,作为提示的文本
String[]books = new String[]{
"疯狂Java讲义",
"疯狂Ajax讲义",
"疯狂XML讲义",
"疯狂Workflow讲义"
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个ArrayAdapter,封装数组
ArrayAdapter<String> aa = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_it em_1line, books);
actv = (AutoCompleteTextView)findViewById(R.id.auto);
// 设置Adapter
actv.setAdapter(aa);
mauto = (MultiAutoCompleteTextView)findViewById(R.id.mauto);
// 设置Adapter
mauto.setAdapter(aa);
// 为MultiAutoCompleteTextView设置分隔符
mauto.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
}
- 网格视图(GridView)的功能及用法
属性名称
描述
android:columnWidth
设置列的宽度。关联的方法为:setColumnWidth(int)
android:gravity
设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical 可以多选,用“|”分开。关联方法:setGravity (int gravity)
android:horizontalSpacing
两列之间的间距。关联方法:setHorizontalSpacing(int)
android:numColumns
列数。关联方法:setNumColumns(int)
android:stretchMode
缩放模式。关联方法:setStretchMode(int)
android:verticalSpacing
两行之间的间距。关联方法:setVerticalSpacing(int)
android:stretchMode支持如下属性值
NO_STRETCH不拉伸
STRETCH_SPACING仅拉伸元素之间的间距
STRETCH_SPACING_UNIFORM表格元素本身、元素之间的间距一起拉伸
STRETCH_COLUMN_WIDTH仅拉伸表格元素本身
main.xml
<!-- 定义一个GridView组件 -->
<GridView
android:id="@+id/grid01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:horizontalSpacing="1pt"
android:verticalSpacing="1pt"
android:numColumns="4"
android:gravity="center"/>
<!-- 定义一个ImageView组件 -->
<ImageView android:id="@+id/imageView"
android:layout_width="240dp"
android:layout_height="240dp"
android:layout_gravity="center_horizontal"/>
MainActivity.java
public class MainActivity extends Activity {
GridView grid;
ImageView imageView;
int[]imageIds = new int[] {
R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7
, R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10
, R.drawable.bomb11 , R.drawable.bomb12 , R.drawable.bomb13
, R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个List对象,List对象的元素是Map
List<Map<String, Object>> listItems=
new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageIds.length; i++) {
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("image", imageIds[i]);
listItems.add(listItem);
}
// 获取显示图片的ImageView
imageView = (ImageView) findViewById(R.id.imageView);
// 创建一个SimpleAdapter
SimpleAdapter simpleAdapter= new SimpleAdapter(this,
listItems
// 使用/layout/cell.xml文件作为界面布局 <!--cell里面一个ImageView的图片-->
, R.layout.cell, new String[] { "image" },
new int[] { R.id.image1 });
grid = (GridView) findViewById(R.id.grid01);
// 为GridView设置Adapter
grid.setAdapter(simpleAdapter);
// 添加列表项被选中的监听器
grid.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 显示当前被选中的图片
imageView.setImageResource(imageIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 添加列表项被单击的监听器
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 显示被单击的图片
imageView.setImageResource(imageIds[position]);
}
});
}
}
- 可展开的列表组件(ExpandableListView)
把应用中的列表项分为几组,每组里又可包含多个列表项。列表项由ExpandableListAdapter提供。
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建一个BaseExpandableListAdapter对象
ExpandableListAdapter adapter =new BaseExpandableListAdapter() {
int[]logos = new int[] {
R.drawable.p,
R.drawable.z,
R.drawable.t
};
private String[]armTypes = new String[]
{ "神族兵种", "虫族兵种", "人族兵种"};
private String[][]arms = new String[][]
{
{ "狂战士", "龙骑士", "黑暗圣堂", "电兵" },
{ "小狗", "刺蛇", "飞龙", "自爆飞机" },
{ "机枪兵", "护士MM" , "幽灵" }
};
@Override
public ObjectgetChild(int groupPosition, int childPosition) {
// 获取指定组位置、指定子列表项处的子列表项数据
return arms[groupPosition][childPosition];
}
@Override
public longgetChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public intgetChildrenCount(int groupPosition) {
// 特定组所包含的子列表项的数量
return arms[groupPosition].length;
}
private TextViewgetTextView() {
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(MainActivity.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView;
}
@Override
public ViewgetChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// 该方法决定每个子选项的外观
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition)
.toString());
return textView;
}
@Override
public ObjectgetGroup(int groupPosition) {
// 获取指定组位置处的组数据
return armTypes[groupPosition];
}
@Override
public intgetGroupCount() {
// 返回包含的组列表项的数量
return armTypes.length;
}
@Override
public longgetGroupId(int groupPosition) {
return groupPosition;
}
// 该方法决定每个组选项的外观
@Override
public ViewgetGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// 返回的View对象将作为组列表项
LinearLayout ll = new LinearLayout(MainActivity.this);
ll.setOrientation(0);
ImageView logo = new ImageView(MainActivity.this);
logo.setImageResource(logos[groupPosition]);
ll.addView(logo);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
@Override
public booleanisChildSelectable(int groupPosition,
int childPosition) {
return true;
}
@Override
public booleanhasStableIds() {
return true;
}
};
ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list);
expandListView.setAdapter(adapter);
}
}
- Spinner的功能及用法
列表选择框(相当于弹出一个菜单供用户选择)
// 建立Adapter并且绑定数据源、mItems数组资源
ArrayAdapter<String> _Adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);
//绑定 Adapter到控件
mSpinner.setAdapter(_Adapter);
//Spinner在布局文件中声明
- AdapterViewFlipper的功能及用法
会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。
在切换过程中可以使用渐隐渐显的动画效果。还可以调用startFlipping()控制它“自动播放”下一个View组件。
AdapterViewAnimator支持的属性:
xml属性说明android:animateFirstView设置显示该组件的第一个view时是否使用动画android:inAnimation设置组件显示时使用的动画android:loopViews设置循环到最后一个组件后是否自动“转头”到第一个组件android:outAnimation 设置组件隐藏时使用的动画AdapterViewFlipper支持的xml属性及相关方法:
xml属性相关方法说明android:autoStartstartFlipping()设置显示该组件是否自动播放android:flipIntervalsetFlipInterval(int)设置自动播放的时间间隔自动播放图片
布局:
<AdapterViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:flipInterval="5000"
android:layout_alignParentTop="true"/>
<Button
...
android:onClick="prev"
android:text="上一个"/>
<Button
...
android:onClick="next"
android:text="下一个"/>
<Button
...
android:onClick="auto"
android:text="自动播放"/>
代码:
public class MainActivity extends Activity {
int[]imageIds = new int[] {
R.drawable.shuangzi, R.drawable.shuangyu,
R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie,
R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping,
R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu,
R.drawable.mojie };
private AdapterViewFlipper flipper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
flipper = (AdapterViewFlipper) findViewById(R.id.flipper);
// 创建一个BaseAdapter对象,该对象负责提供Gallery所显示的列表项
BaseAdapteradapter = new BaseAdapter() {
@Override
public int getCount() {
return imageIds.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
// 该方法返回的View代表了每个列表项
@Override
public ViewgetView(int position, View convertView, ViewGroup parent) {
// 创建一个ImageView
ImageView imageView = newImageView(MainActivity.this);
imageView.setImageResource(imageIds[position]);
// 设置ImageView的缩放类型
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
// 为imageView设置布局参数
imageView.setLayoutParams(new ViewGroup.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return imageView;
}
};
flipper.setAdapter(adapter);
}
public voidprev(View source) {
// 显示上一个组件
flipper.showPrevious();
// 停止自动播放
flipper.stopFlipping();
}
public voidnext(View source) {
// 显示下一个组件。
flipper.showNext();
// 停止自动播放
flipper.stopFlipping();
}
public voidauto(View source) {
// 开始自动播放
flipper.startFlipping();
}
}
- StackView的功能及用法
以“堆叠”的方式来显示多个列表项,为了控制StackView显示的view组件,StackView提供了如下两种控制方式:
①拖走StackView中处于顶端的View,下一个View将会显示出来。将上一个View拖进StackView,将使之显示出来
②通过调用StackView的showNext()、showPrevious()控制显示下一个、上一个组件
叠在一起的图片
布局main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<StackView
android:id="@+id/mStackView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:loopViews="true" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一个"
android:onClick="prev"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一个"
android:onClick="next"/>
</LinearLayout>
</LinearLayout>
另外cell布局里只是一个ImageView内容
代码
public class MainActivity extends Activity {
StackView stackView;
int[] imageIds = new int[] {
R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7
, R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10
, R.drawable.bomb11 , R.drawable.bomb12 , R.drawable.bomb13
, R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
stackView = (StackView) findViewById(R.id.mStackView);
// 创建一个List对象,List对象的元素是Map
List<Map<String, Object>> listItems =
new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageIds.length; i++) {
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("image", imageIds[i]);
listItems.add(listItem);
}
// 创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this,
listItems
// 使用/layout/cell.xml文件作为界面布局
, R.layout.cell, new String[] { "image" },
new int[] { R.id.image1 });
stackView.setAdapter(simpleAdapter);
}
public void prev(View view) {
// 显示上一个组件
stackView.showPrevious();
}
public void next(View view) {
// 显示下一个组件
stackView.showNext();
}
}
0 0
- 2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
- UI组件:AdapterView及子类(一)
- UI组件:AdapterView及子类(二)
- android-UI组件(四):AdapterView及其子类
- Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
- Android用户界面UI组件--AdapterView及其子类(三) ExpandableListView
- Android用户界面UI组件--AdapterView及其子类(四) GridView
- Android用户界面 UI组件--AdapterView及其子类(二) AdapterViewAnimator及其子类
- android基础-AdapterView及子类
- UI组件之AdapterView及其子类(五)ListView组件和ListActivity
- UI组件之AdapterView及其子类(六)ExpandableListView组件和ExpandableListActivity的使用
- Android用户界面UI组件--AdapterView及其子类(五) Spinner和SpinnerAdapter
- Android界面编程之五 第四组UI组件:AdapterView及其子类
- Android AdapterView及子类的介绍(一)
- ui.AdapterView及其子类
- UI组件之AdapterView及其子类(一)三种Adapter适配器填充ListView
- UI组件之AdapterView及其子类(二)GridView网格视图的使用
- UI组件之AdapterView及其子类(三)Spinner控件详解
- 【Codeforces】-651C -Watchmen
- Java的继承
- Javascript:面试最容易被问到的的7个框架
- 自定义UITextField使TextField文字有缩进效果
- 安装虚拟机报错:Could not get vmci driver version: 参数错误. You have an incorrect version of driver "vmci.sys".
- 2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
- Lock接口(锁的实现)
- 二分查找算法实现
- Duilib学习总结
- Network In Network学习笔记-ICLR 2014
- aop-注解方式
- Java基础-double的精度问题
- 12个优化Unity/GearVR应用的小技巧, 比较好
- 基于淘宝点击及购买记录的口碑商家推荐——基于物品的协同过滤