Android学习笔记⑦——UI组件的学习AdapterView相关1
AdapterView是一个非常重要的组件之一,他非常灵活,所以得好好学。。。AdapterView本身是一个抽象类,派生出来的子类用法也十分相似,只是界面有一定的区别,因此本节把他们归为一类
AdapterView的特性有:AdapterView 继承了ViewGroup,即它的本质是一个容器 、AdapterView可以包括多个列表项,并且将他们合适的显示、AdapterView与适配器Adapter是有着千丝万缕的关系的,一般都是AdapterView调用setAdapter()方法来填充。
具体的 继承图如下:图片的来源(http://blog.csdn.net/yongyu_it/article/details/44096953)
ListView配合简单数组实例
下面就让我们先来学习ListView控件的相关用法:
不用Adapter接口来实现内容的填充,直接在values - strings 中添加一个所需要的数组,具体代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ListView 7 android:layout_width="wrap_content" 8 android:layout_height="wrap_content" 9 android:entries="@array/books" 10 android:divider="@color/red" 11 android:dividerHeight="4px" 12 ></ListView> 13 </LinearLayout>
strings中的数组代码:
<resources> <string name="app_name">AdapterView组件测试 </string> <string-array name="books"> <item>Android基础1</item> <item>Android基础2</item> <item>Android基础3</item> <item>Android基础4</item> <item>Android基础5</item> </string-array> </resources>
运行的截图如下:
这是一个简单的运用,其中的 android:entries="@array/books" 是用来得到该列表的数组资源的,使用数组创建ListView十分简单,之所以简单,是因为这样的方法很难定制其他的,比如更改列表项的字体、颜色、外观,所以如果想更改就要把ListView作为AdapterView使用,通过Adapter来实现。
Adapter相关
Adapter本身是一个接口,也派生出来ListAdapter和SpinnerAdapter两个子接口具体的图如下所示:( 图片来自百度图库 )
从上面的继承图可以看出 还是蛮清晰的,几乎所有的Adapter都继承BaseAdapter。那么多,就学习一些常用的吧。
Adapter常用的实现类有:
ArrayAdapter :简单、易用,通常用于数组或者List集合的多个值包装成多个列表项
SimpleAdapter: 不简单、强大的Adapter,可用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter相似、但只包装Cursor提供的数据
BaseAdapter:非常强大、用于扩展,自定义各种需要的列表项
ListView配合ArrayAdapter实例
布局内的代码,两个ListView:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 8 <ListView 9 android:id="@+id/list1" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:divider="@color/green" 13 android:dividerHeight="3px"> 14 </ListView> 15 16 <ListView 17 android:id="@+id/list2" 18 android:layout_width="match_parent" 19 android:layout_height="wrap_content" 20 android:divider="@color/red" 21 android:dividerHeight="3px"> 22 </ListView> 23 </LinearLayout>
java代码:
1 package com.doliao.helloworld; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.ArrayAdapter; 6 import android.widget.ListView; 7 8 /** 9 * Created by Administrator on 2016/10/10 0010. 10 */ 11 12 public class AdapterActivity extends Activity { 13 14 15 ListView listView1, listView2; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_adapterview2); 21 22 listView1 = (ListView) findViewById(R.id.list1); 23 listView2 = (ListView) findViewById(R.id.list2); 24 25 String[] arrayList1 = {"第一个list", "第一个list", "第一个list"}; 26 String[] arrayList2 = {"第二个list", "第二个list", "第二个list"}; 27 ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, R.layout.array1, arrayList1); 28 ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, R.layout.array2, arrayList2); 29 30 listView1.setAdapter(adapter1); 31 listView2.setAdapter(adapter2); 32 } 33 }
数组的布局:
1 <?xml version="1.0" encoding="utf-8"?> 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:textColor="#000" 7 android:textSize="10pt" 8 />
运行截图:
ArrayAdapter与ListView结合 跟上一个 ListView与原生的数组结合相比较,一个可以改变字体颜色大小,一个不可改变,那如果想要跟QQ的好友列表类似,那么就要学SimpleAdapter,下面就是学习SimplerAdapter
SimpleAdapter配合ListView实例
布局代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ListView 7 android:id="@+id/list3" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content"> 10 </ListView> 11 </LinearLayout>
设置列表格式的 布局代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal"> 6 7 <ImageView 8 android:id="@+id/image_icon" 9 android:layout_width="100px" 10 android:layout_height="100px" /> 11 12 <LinearLayout 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:orientation="vertical"> 16 17 <TextView 18 android:id="@+id/text_name" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:textSize="10pt" 22 /> 23 24 <TextView 25 android:id="@+id/text_state" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:textSize="10pt" 29 /> 30 </LinearLayout> 31 </LinearLayout>
java界面的代码:
1 package com.doliao.helloworld; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.ListView; 6 import android.widget.SimpleAdapter; 7 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.List; 11 import java.util.Map; 12 13 /** 14 * Created by Administrator on 2016/10/10 0010. 15 */ 16 17 public class SimpleAdapterActivity extends Activity { 18 19 ListView listView; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_adapterview3); 25 listView = (ListView) findViewById(R.id.list3); 26 27 int[] imageIds = new int[]{R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5}; 28 String[] names = new String[]{"射箭", "网球", "足球", "滑雪", "登山"}; 29 String[] states = new String[]{"百发百不中的射手", "一直捡球的网球手", "护国足球", "滑雪滑雪滑雪滑雪", "登高登高登高赏菊"}; 30 31 List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); 32 for (int i = 0; i < names.length; i++) { 33 Map<String, Object> map = new HashMap<String, Object>(); 34 map.put("pic", imageIds[i]); 35 map.put("name", names[i]); 36 map.put("state", states[i]); 37 listItems.add(map); 38 } 39 SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.simpleadapter, new String[]{"pic", "name", "state"}, 40 new int[]{R.id.image_icon, R.id.text_name, R.id.text_state}); 41 42 listView.setAdapter(simpleAdapter); 43 } 44 }
运行截图如下:
以上就是自定义内容,使的列表内容变得丰富,主要用到的是SimpleAdapter,SimpleAdapter有五个参数,会用这五个参数是十分关键的!
第一个参数:Context 上下文参数
第二个参数:参照源码是 List<? extends Map<String, ?>> 这种类型的集合对象
第三个参数:页面布局的一个序列号 一般是R.layout.xxxx 中的xxxx
第四个参数:这个参数是一个String[]类型的参数,取决于Map<String,?> 对象的中的哪些key对应的value来生成列表项
第五个参数:这个参数是一个int[]类型的参数,取决于你第三个参数界面中的对应组件的id
BaseAdapter 与ListView 实例
布局代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <ListView 8 android:id="@+id/list4" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content"> 11 12 </ListView> 13 </LinearLayout>
java代码:
1 package com.doliao.helloworld; 2 3 import android.app.Activity; 4 import android.graphics.Color; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.ViewGroup; 8 import android.widget.BaseAdapter; 9 import android.widget.ImageView; 10 import android.widget.LinearLayout; 11 import android.widget.ListView; 12 import android.widget.TextView; 13 14 /** 15 * Created by Administrator on 2016/10/10 0010. 16 */ 17 18 public class BaseAdapterActivity extends Activity { 19 20 ListView listView; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_adapterview4); 26 listView = (ListView) findViewById(R.id.list4); 27 28 BaseAdapter baseAdapter = new BaseAdapter() { 29 @Override 30 public int getCount() { 31 return 30; 32 } 33 34 @Override 35 public Object getItem(int position) { 36 return null; 37 } 38 39 @Override 40 public long getItemId(int position) { 41 return position; 42 } 43 44 @Override 45 public View getView(int position, View convertView, ViewGroup parent) { 46 47 LinearLayout linear = new LinearLayout(BaseAdapterActivity.this); 48 linear.setOrientation(0); 49 ImageView imageView = new ImageView(BaseAdapterActivity.this); 50 imageView.setImageResource(R.drawable.yes); 51 TextView textView = new TextView(BaseAdapterActivity.this); 52 textView.setText("第" + (position + 1) + "个列表项"); 53 textView.setTextSize(20); 54 textView.setTextColor(Color.RED); 55 linear.addView(imageView); 56 linear.addView(textView); 57 return linear; 58 } 59 }; 60 61 listView.setAdapter(baseAdapter); 62 } 63 }
运行截图:
当创建一个BaseAdapter的时候,该对象要重写4个方法:
getCount() 该方法的返回值会控制Adapter将会包含多少个列表项,
getItem(int position) 返回值决定第position处的列表项的内容
getItemId(id position) 返回值觉得第position出的列表项的ID
getView(int position,View convertView ,View Group parent) 这个方法不是非常的明白,于是百度了下 见 http://blog.csdn.net/pkxiuluo01/article/details/7380974 这边比较详细的介绍了参数的用途。
SimpleCursorAdapter
是与数据库中的数据相关的,暂时先不学。。。
AutoCompleteTextView(自动提示框)
AutoCompleteTextView 是由EditView派生出来的一个子类,他的作用跟EditView相似,唯一不同的就是AutoCompleteTextView 组件,当你输入一些内容时,会根据内容给出一些提示,当然这些提示是你要事先设置好的, 设置的方法就是设置一个Adapter了,Adapter封装了所需要的提示文本,这样以来就OK了。当然AutoCompleteTextView 也蛮厉害的他也生了一个儿子MultiAutoCompleteTextView ,它的功能就更加强大了——允许输入多个提示项,多个提示项目之间用逗号隔开,当然使用的方法是一样的,都是通过Adapter。
下面就来个实例,布局代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_main" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="com.doliao.helloworld.MainActivity"> 8 9 <AutoCompleteTextView 10 android:id="@+id/autotext" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" /> 13 </LinearLayout>
java代码:
1 package com.doliao.helloworld; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.widget.ArrayAdapter; 6 import android.widget.AutoCompleteTextView; 7 8 public class MainActivity extends AppCompatActivity { 9 10 AutoCompleteTextView autoCompleteTextView; 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autotext); 17 18 String []array = new String[]{"JAVA","AJAX","XML","Android"}; 19 20 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.autotext,array); 21 22 autoCompleteTextView.setAdapter(arrayAdapter); 23 } 24 }
在设置ArrayAdapter的时候,第二个参数的布局代码我就不贴了,前面有的。
运行截图为: