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 };

	@Override
	protected 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() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				//显示被点击的图片
				img.setImageResource(imgs[position]);
				System.out.println("被点击了~~~~~~~~~~~");
			}
		});
		//给GridView选中监听
		gview.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				//显示被选中的图片
				img.setImageResource(imgs[position]);
				System.out.println("被选中了");
			}

			@Override
			public 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"
	>
<ImageView
	android: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;

	@Override
	protected 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[][] 
			{
				{ "盖伦", "奎因", "嘉文四世" },
				{ "德莱厄斯", "卡特琳娜", "德莱文", "泰隆" },
				{ "艾希", "努努", "艾尼维亚", "林桑桌", "布隆" } 
			};

		@Override
		public int getGroupCount() {
			return armType.length;
		}
		//获取某个分组的孩子们的个数
		@Override
		public int getChildrenCount(int groupPosition) {
			return arms[groupPosition].length;
		}
                //获得这个组的元素
		@Override
		public Object getGroup(int groupPosition) {
			return armType[groupPosition];
		}

		@Override
		public Object getChild(int groupPosition, int childPosition) {
			return arms[groupPosition][childPosition];
		}

		@Override
		public long getGroupId(int groupPosition) {
			return groupPosition;
		}
		
		@Override
		public long getChildId(int groupPosition, int childPosition) {
			return childPosition;
		}

		@Override
		public boolean hasStableIds() {
			return false;
		}
		//每个组的外观怎么显示
		@Override
		public 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;
		}
		//子列表的外观
		@Override
		public 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;
		}

		@Override
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			// TODO Auto-generated method stub
		return 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;
	@Override
	protected 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" >

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/lol" />

    <Spinner
        android: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;

	@Override
	protected 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" >

    <HorizontalScrollView
        android:id="@+id/hsv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android: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;

	@Override
	protected 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() {
			
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				//创建ImageView
				ImageView 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;
			}
			
			@Override
			public long getItemId(int position) {
				return position;
			}
			
			@Override
			public Object getItem(int position) {
				return image[position];
			}
			
			@Override
			public 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" >

    <AdapterViewFlipper
        android:id="@+id/avf"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:flipInterval="3000" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:onClick="prev"
        android:text="上一个" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="next"
        android:text="下一个" />

    <Button
        android: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;

	@Override
	protected 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" >

    <StackView
        android:id="@+id/stack"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:background="#00FF00"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" 
        android:paddingTop="300dp">

        <Button
            android:id="@+id/prov"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="prov"
            android:text="上一个" />

        <Button
            android: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"
	>
<ImageView
	android:id="@+id/image1"
	android:layout_width="50dp" 
	android:layout_height="50dp" 
	/>	
</LinearLayout>

效果图:





总结:

AdapterView开头的都需要有适配器才能显示的视图,如果还有后缀是该控件的功能扩展。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListViewAndroid中最常用的UI组件之一,用于展示具有固定结构的大量数据。它继承自AdapterView,可以通过Adapter来动态地显示数据。 ListView的特点是:每一行数据都是相同的布局,并且每个Item的高度是相同的。因此,我们可以利用ListView来展示一些比较简单的数据列表。 在使用ListView时,我们需要实现一个Adapter来提供数据,并且可以对ListView的Item进行自定义布局。以下是一个简单的使用ListView的例子: ```java public class MainActivity extends AppCompatActivity { private ListView mListView; private List<String> mDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); // 初始化数据 mDataList = new ArrayList<>(); for (int i = 0; i < 50; i++) { mDataList.add("Item " + i); } // 创建适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mDataList); // 设置适配器 mListView.setAdapter(adapter); } } ``` 在这个例子中,我们使用了Android自带的ArrayAdapter作为ListView的适配器,并且使用了系统提供的简单列表项布局simple_list_item_1,将数据逐一展示在ListView中。 除了普通的ListViewAndroid还提供了一个ListActivity类,它是一个已经封装好的Activity,专门用来展示ListView。我们只需要继承ListActivity,实现一个适配器即可。以下是一个使用ListActivity的例子: ```java public class MainActivity extends ListActivity { private List<String> mDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化数据 mDataList = new ArrayList<>(); for (int i = 0; i < 50; i++) { mDataList.add("Item " + i); } // 创建适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mDataList); // 设置适配器 setListAdapter(adapter); } } ``` 在这个例子中,我们继承了ListActivity,并且在onCreate()方法中直接使用setListAdapter()方法设置适配器,省去了findViewById()和ListView的初始化过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值