Android AdapterView以及子类
AdapterVIew本身是一个抽象基类,它派生的子类用法十分相似。
Adapter特征:
AdapterView继承了ViewGroup,它本质是容器Adapter可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来AdapterView显示多个“列表项”由Adapter提供,调用AdapterView的setAdapter(adapter)方法设置即可。
GridView网格视图
之前有说过ListView和Adapter,本次要说的是GridView,它和ListView基本相同,区别在于ListView只显示一列,而GridView可以显示多列,当GridView只显示一列的话,那么它相当于ListView。关系图解
GridView常用属性
android:columnWidth 设置列的宽度
android:gravity 设置对齐方式
android:horizontalSpacing 设置各元素之间的水平间距
android:verticalSpacing 设置各元素之间的垂直间距
android:numColumns 设置列数 默认是1
android:stretchMode 设置拉伸模式
GridView的Demo:
MainActivity.java
public class MainActivity extends Activity {GridView gview;ImageView img;//给适配器设置9张系统内置的图片int[] imgs = new int[] { android.R.drawable.ic_btn_speak_now,android.R.drawable.ic_delete,android.R.drawable.ic_dialog_alert,android.R.drawable.ic_dialog_dialer,android.R.drawable.ic_dialog_email,android.R.drawable.ic_lock_idle_alarm,android.R.drawable.ic_input_add,android.R.drawable.ic_media_ff,android.R.drawable.ic_menu_call };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);img=(ImageView) findViewById(R.id.img);List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();//通过循环把9张图片添加List集合中for (int i = 0; i < imgs.length; i++) {Map<String, Object> map = new HashMap<String, Object>();map.put("image", imgs[i]);listitems.add(map);}//参数3 展示的布局文件//参数4 把参数2集合中的Key值拿出来//参数5 把拿出来的key值放在该空间上展示SimpleAdapter adapter = new SimpleAdapter(this, listitems, R.layout.cell, new String[]{"image"}, new int[]{R.id.image1});gview=(GridView) findViewById(R.id.gv);gview.setAdapter(adapter);//给GridView添加点击监听gview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//显示被点击的图片img.setImageResource(imgs[position]);System.out.println("被点击了~~~~~~~~~~~");}});//给GridView选中监听gview.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {//显示被选中的图片img.setImageResource(imgs[position]);System.out.println("被选中了");}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});}
}
activity_main.xml
<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"android:gravity="center_horizontal" ><GridView android:id="@+id/gv" android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="3"android:gravity="center"android:horizontalSpacing="1pt"android:verticalSpacing="1pt"/><ImageView android:id="@+id/img"android:layout_width="300dp"android:layout_height="300dp"android:layout_gravity="center_horizontal"/></LinearLayout>
cell.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="fill_parent"android:gravity="center_horizontal"android:padding="2pt">
<ImageViewandroid:id="@+id/image1"android:layout_width="50dp" android:layout_height="50dp" />
</LinearLayout>
效果图:
ExpandableListView可展开的列表组件
ExpandableListView是ListView的子类,它进行的扩展是把列表项分为几组,每个组里又包含多个列表项,在用法上与ListView非常相似,ExpandableListView的列表项由ExpandableListAdapter提供,ExpandableListAdapter也是一个接口,下面是该接口的继承关系图:
上图可以看出,虽然后缀是Adapter但是他的关系只是继承Object而已,但是与Adapter类似,它有三种常用方式
1.扩展BaseExpandableListAdapter实现ExpandableListAdapte
2.使用SimpleExpandableListAdapter将两个List集合
3.使用SimpleCursorTreeAdapter将Cursor中的数据包装成SimpleCursorTreeAdapter
额外支持的XML属性
android:childDivider 指定各组内各子列表项之间的分隔条
android:childIndicator 显示在子列表旁边的Drawalbe对象
android:groupIndicator 显示在组列表项旁边的Drawable对象
组元素表示可折叠的列表项,子元素表示列表项展开后看到的多个子元素项
简单模拟QQ分组样式
MainActivity.java
public class MainActivity extends Activity {private ExpandableListView expan;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);expan=(ExpandableListView) findViewById(R.id.expan);expan.setAdapter(new MyAdapter());}class MyAdapter extends BaseExpandableListAdapter {private String[] armType = new String[] { "德玛西亚", "诺克萨斯", "弗雷尔卓德" };private String[][] arms = new String[][] {{ "盖伦", "奎因", "嘉文四世" },{ "德莱厄斯", "卡特琳娜", "德莱文", "泰隆" },{ "艾希", "努努", "艾尼维亚", "林桑桌", "布隆" } };@Overridepublic int getGroupCount() {return armType.length;}//获取某个分组的孩子们的个数@Overridepublic int getChildrenCount(int groupPosition) {return arms[groupPosition].length;}//获得这个组的元素@Overridepublic Object getGroup(int groupPosition) {return armType[groupPosition];}@Overridepublic Object getChild(int groupPosition, int childPosition) {return arms[groupPosition][childPosition];}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return false;}//每个组的外观怎么显示@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {LinearLayout ll = new LinearLayout(MainActivity.this);ll.setOrientation(LinearLayout.HORIZONTAL);TextView textView = getTextView();textView.setText(getGroup(groupPosition).toString());ll.addView(textView);return ll;}//子列表的外观@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {TextView textView = getTextView();textView.setText(getChild(groupPosition, childPosition).toString());textView.setPadding(100, 0, 0, 0);return textView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn false;}private TextView getTextView(){AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);TextView textView = new TextView(MainActivity.this);textView.setLayoutParams(lp);textView.setPadding(80, 0, 0, 0);return textView;}}
}
activity_main.xml只是定义了ExpandableListView而已,这里就不给出了。
虽然方法比较多,但最重要的是这个4个:
getGroupCount();返回组列表的个数
getGroupView();返回组视图
getChildrenCount();返回子列表的个数
getChildView();返回子视图
效果图:
Spinner下拉列表组件
常用XML属性
android:entries 使用XML数组的形式设置下拉列表显示的项目
android:dropDownHorizontalOffset 设置下拉列表的水平偏移量
android:dropDownVerticalOffset 设置下拉列表的垂直偏移量
android:dropDownWidth 设置下拉列表框的宽度
android:popupBackground 设置下拉列表的背景色
android:prompt 设置该列表选择框的提示信息
默认选择第一个元素,它有设置值的方式,一种是XML文件数组形式,另一种是adapter。
Mainactivity.java
public class MainActivity extends Activity {private Spinner s;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);s=(Spinner) findViewById(R.id.s);ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, new String[]{"德玛西亚","剑圣偷塔","盲僧抓瞎"});s.setAdapter(adapter);}
}
activity_main.java
<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:gravity="center_horizontal"android:orientation="vertical" ><Spinnerandroid:layout_width="match_parent"android:layout_height="wrap_content"android:entries="@array/lol" /><Spinnerandroid:id="@+id/s"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
lol.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="lol"><item>提莫</item><item>艾希</item><item>蛮</item><item>易</item><item>信</item></string-array>
</resources>
gallery画廊视图
在API8以上已经过时,原因过度耗费系统资源,推荐使用HorizontalScrollView或者ViewPager,同样HorizontalScrollView图片较多也会OOM,并且只能有一个唯一的子控件,VIewPager滑动的时候会删除没有显示的图片释放资源,并且预加载可能要用到的图片。
下面是HorizontalScrollView的事例:
Mainactivity.java
public class MainActivity extends Activity {HorizontalScrollView hsv;LinearLayout ll;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);hsv = (HorizontalScrollView) findViewById(R.id.hsv);ll = (LinearLayout) findViewById(R.id.ll);int imgs[] = new int[] { android.R.drawable.ic_delete,android.R.drawable.ic_dialog_alert,android.R.drawable.ic_dialog_email,android.R.drawable.ic_dialog_info,android.R.drawable.ic_dialog_map,android.R.drawable.ic_delete,android.R.drawable.ic_dialog_alert,android.R.drawable.ic_dialog_email,android.R.drawable.ic_dialog_info,android.R.drawable.ic_dialog_map,android.R.drawable.ic_delete,android.R.drawable.ic_dialog_alert,android.R.drawable.ic_dialog_email,android.R.drawable.ic_dialog_info,android.R.drawable.ic_dialog_map,android.R.drawable.ic_delete,android.R.drawable.ic_dialog_alert,android.R.drawable.ic_dialog_email,android.R.drawable.ic_dialog_info,android.R.drawable.ic_dialog_map};for (int i = 0; i < imgs.length; i++) {// 创建ImageView 并设置宽高ImageView img = new ImageView(this);// 设置显示的图片img.setBackgroundResource(imgs[i]);ll.addView(img);}}
}
activity_main.xml
<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:gravity="center_horizontal"android:orientation="horizontal" ><HorizontalScrollViewandroid:id="@+id/hsv"android:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayoutandroid:orientation="horizontal"android:id="@+id/ll"android:layout_width="wrap_content"android:layout_height="wrap_content" ></LinearLayout></HorizontalScrollView></LinearLayout>
效果图:
AdapterViewFlipper
AdapterViewFlipper继承了AdapterViewAnimator,它在AdapterView的基础上新增了滑动时的动画。它也会显示Adapter提供多个View组件,但它每次只能显示一个View组件,程序中可通过showPrevious()和showNext()方法控制该组件现实上一个,下一个组件。AdapterViewFlipper可以在多个View切换过程中自动使用渐隐渐现的动画效果,除此之外,还可以调用该组件的startFlipping控制自动播放下一个View组件。
MainActivity.java
public class MainActivity extends Activity {AdapterViewFlipper avf;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);avf = (AdapterViewFlipper) findViewById(R.id.avf);final int image[] = new int[] { android.R.drawable.alert_dark_frame,android.R.drawable.arrow_down_float,android.R.drawable.bottom_bar, android.R.drawable.btn_default,android.R.drawable.btn_dialog };BaseAdapter adapter = new BaseAdapter() {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//创建ImageViewImageView img = new ImageView(MainActivity.this);img.setImageResource(image[position]);//设置ImageView缩放类型img.setScaleType(ImageView.ScaleType.FIT_XY);//设置ImageView布局参数img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));return img;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic Object getItem(int position) {return image[position];}@Overridepublic int getCount() {return image.length;}};avf.setAdapter(adapter);}public void prev(View view){//设置上一个组件avf.showPrevious();}public void next(View view){//设置下一个组件avf.showNext();}public void auto(View view){//自动播放avf.startFlipping();}
}
activity.xml
<RelativeLayout 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" ><AdapterViewFlipperandroid:id="@+id/avf"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:flipInterval="3000" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:onClick="prev"android:text="上一个" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:onClick="next"android:text="下一个" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:onClick="auto"android:text="自动播放" /></RelativeLayout>
效果图:
StackView堆叠
StackView是AdapterViewAnimator的子类,StackView将会以堆叠方式来显示多个列表项,当拖走StackView中处于顶端的View,下一个View就是显示出来,将上一个View拖进StackView,将使之显示出来。
MainActivity.java
public class MainActivity extends Activity {StackView stack;Button b1, b2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);stack = (StackView) findViewById(R.id.stack);b1 = (Button) findViewById(R.id.prov);b2 = (Button) findViewById(R.id.next);int img[] = new int[] { android.R.drawable.bottom_bar,android.R.drawable.btn_default_small,android.R.drawable.btn_radio, android.R.drawable.toast_frame,android.R.drawable.sym_contact_card,android.R.drawable.stat_sys_speakerphone};List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();for(int i=0;i<img.length;i++){Map<String,Object> map = new HashMap<String, Object>();map.put("image", img[i]);list.add(map);}SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.cell, new String[]{"image"}, new int[]{R.id.image1});stack.setAdapter(adapter);}public void prov(View view){stack.showPrevious();}public void next(View view){stack.showNext();}
}
activity_main.xml
<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" ><StackViewandroid:id="@+id/stack"android:layout_width="match_parent"android:layout_height="wrap_content" android:background="#00FF00"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" android:paddingTop="300dp"><Buttonandroid:id="@+id/prov"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="prov"android:text="上一个" /><Buttonandroid:id="@+id/next"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="next"android:text="下一个" /></LinearLayout></LinearLayout>
cell.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="fill_parent"android:gravity="center_horizontal"android:padding="2pt">
<ImageViewandroid:id="@+id/image1"android:layout_width="50dp" android:layout_height="50dp" />
</LinearLayout>
效果图:
总结:
AdapterView开头的都需要有适配器才能显示的视图,如果还有后缀是该控件的功能扩展。
Android AdapterView以及子类相关推荐
- android adapter 组件,Android UI - AdapterView 及其子类
AdapterView AdapterView 是一个抽象类,其派生的子类在用法上十分相似: AdapterView 继承了 ViewGroup: AdapterView 及其子类的继承关系如下: A ...
- Android开发自学笔记(Android Studio)—4.4 AdapterView及其子类
一.引言 AdapterView本身是一个抽象类,而它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. AdapterView具有如下特征: AdapterView继承自V ...
- UI组件之AdapterView及其子类(四)Gallery画廊控件使用
听说 Gallery现在已经不使用了,API使用ViewPaper代替了,以后再学专研ViewPaper吧现在说说Gallery画廊,就是不停显示图片的意思 Gallery是用来水平滚动的显示一系列项 ...
- UI组件之AdapterView及其子类(一)三种Adapter适配器填充ListView
AdapterView的内容一般是包含多项相同格式资源的列表,常用的有5种AdapterView的子类: (1)ListView:简单的列表 (2)Spinner:下拉列表,给用户提供选择 (3)Ga ...
- android-UI组件(四):AdapterView及其子类
http://blog.csdn.net/litianpenghaha/article/details/23270881 AdapterView组件是一组重要的组件,AdapterView本身是一个抽 ...
- UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系
AdapterView本身是一个抽象基类,它派生的的子类在用法上十分相似.AdapterView直接派生的三个子类:AbsListView,AbsSpinner,AdapterViewAnimator ...
- 2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
列表视图(ListView)和ListActivity ①直接使用ListView创建 ②让Activity继承ListActivity(相当于该activity显示的组件为ListView) 提示: ...
- Android AdapterView 源码分析以及其相关回收机制的分析
前言 忽然,发现,网上的公开资料都是教你怎么继承一个baseadapter,然后重写那几个方法,再调用相关view的 setAdpater()方法, 接着,你的item 就显示在手机屏幕上了.很少有人 ...
- UI组件之AdapterView及其子类(五)ListView组件和ListActivity
ListView组件是一个显示组件,继承AdapterView基类,前面已经介绍了分别使用ArrayAdapter,SimpleAdapter,扩展BaseAdapter来为LisView提供列表项h ...
最新文章
- 中国肠道大会 | 日程及嘉宾
- js 乘法除法精度问题
- 2021-10-12Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- 使用OpenCV进行相机标定
- python--json pickle 模块
- linux带宽最小的远程桌面,【图片】linux下哪种远程桌面服务最快?_linux吧_百度贴吧...
- 【java笔记】java语言的跨平台性和运行环境
- SSM整合(spring mybatis)图书
- Golang快速入门
- linux各个目录作用详解,linux各个目录作用
- 论文阅读笔记|A view-free image stitching network
- Win 10 远程桌面连接
- 关于抢红包的_面试官让我5分钟内写一个抢红包程序,我和他说了半小时原理!...
- [数据库] MariaDB安装及使用
- 奖金600万美元的XPRIZE新冠病毒快速检测竞赛决出大奖获得者,以研制快速、大规模、低成本且简单易用的解决方案
- 《凯恩斯革命的前世今生》导语集(前三章)
- 模型稳定度指标PSI
- 播放FLV文件的方法
- 如何在公司里体现前端的价值以及提升自己的议价能力
- String( ) in String cannot be applied to (java.lang.String)
热门文章
- WOW 7.0.3 以上版本 完美反和谐方法
- 9年没涨价,上太空……这些树莓派的冷知识你知道多少?
- 1.angular html+css+js导航条点击样式修改,加跳转页面
- python 老男孩学习视频
- 每日一句,每日10词【2】(26天)
- 手机导航全球升温 融合化发展成为新趋势
- matlab 扩大虚拟内存方法
- tcpdump与wireshark
- robocraft维护服务器,Robocraft
- Python之一行代码解决这个错误:OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。