在Android开发中经常会用到ListView,也就是列表,而列表的内容需要如何决定呢,很好的方法是使用各种adapter
首先来看看用entries添加列表内容
在布局文件中,创建一个ListView,其内容在values文件夹下的arrays.xml文件中
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/books" android:divider="#f00" android:dividerHeight="2px" android:headerDividersEnabled="false"/>
entries为ListView中的内容;divider为分隔条颜色;dividerHei为分隔条高度
资源文件arrays.xml如下
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="books"> <item>11111111</item> <item>22222222</item> <item>33333333</item> <item>44444444</item> </string-array> </resources>
这样就完成了一个简单的ListView,该列表的内容是存在另一个xml文件中的。
接下来是ArrayAdapter的使用,ListView布局文件与上面一致,除了没有entries参数,因为是使用adapter,MainActivity.java代码如下
public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView list1 = (ListView) findViewById(R.id.list1); String arr1[] = { "111", "222" ,"333" }; ArrayAdapter<String> adapter1 = new ArrayAdapter<String> (this, R.layout.array_item, arr1); list1.setAdapter(adapter1); } }
以上代码创建了一个ArrayAdapter并为它配置了几个参数,其中arr1很明显就是创建的那个数组里的数据,
而R.layout.array_item是ListView里的数据的样式,array_item的内容如下
<?xml version="1.0" encoding="utf-8"?> <TextView android:id="@+id/TextView" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24dp" android:padding="10px" android:shadowColor="#f0f" android:shadowDx="4" android:shadowDy="4" android:shadowRadius="2" />
这个文件里只有一个TextView,而TextView里并未设置内容android:text,而是设置了一堆样式,比如字体大小,阴影之类的
这样在app运行后看到的ListView里的数据的样式就与这个TextView里的一致。
ListActivity的使用
让Activity直接继承ListActivity,这样无需布局界面就可以得到一个列表的界面,代码如下
public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String arr[] = { "111", "222" ,"333" }; ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.support_simple_spinner_dropdown_item, arr); setListAdapter(adapter); } }
可以看到以上代码中没有setContentView方法,也就是没有使用布局界面,因为ListActivity本身就是一个列表型的界面
ArrayAdapter的每个列表项只能是TextView,接下来使用可以自定义的BaseAdapter
布局文件只有一个ListView,并且只进行了简单的设置
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/mylist" android:layout_width="match_parent" android:layout_height="wrap_content" />
Java代码如下
public class MainActivity extends Activity { ListView myList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myList = (ListView) findViewById(R.id.mylist); BaseAdapter adapter = new BaseAdapter() { @Override public int getCount() { return 40; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout line = new LinearLayout(MainActivity.this); line.setOrientation(LinearLayout.HORIZONTAL); ImageView image = new ImageView(MainActivity.this); image.setImageResource(R.mipmap.ic_launcher); TextView text = new TextView(MainActivity.this); text.setText("第" +(position +1 )+"个列表项" ); text.setTextSize(20); text.setHighlightColor(Color.RED); line.addView(image); line.addView(text); return line; } }; myList.setAdapter(adapter); } }
BaseAdapter提供了几个方法来改变列表的显示,比如getCount方法表示数量,getView方法为列表设置了样式
接下来是一个可以展开的列表组件,ExpandableListView,一个ExpandableListView组件的参数没有太多,这里不给出
布局文件的代码,下面是Java文件的代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ExpandableListAdapter adapter = new BaseExpandableListAdapter() { int[] logos = new int[]{ R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher }; private String[] armTypes = new String[]{ "1和10之间","10和20之间","20和30之间" }; private String[][] arms = new String[][]{ {"1","2","3","4"}, {"11","12","13","14"}, {"21","22","23","24"} }; private TextView getTextView(){ 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 int getGroupCount() { return armTypes.length; } @Override public int getChildrenCount(int groupPosition) { return arms[groupPosition].length; } @Override public Object getGroup(int groupPosition) { return armTypes[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 true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LinearLayout ll = new LinearLayout(MainActivity.this); ll.setOrientation(LinearLayout.VERTICAL); 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 View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition,childPosition).toString()); return textView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } }; ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list); expandListView.setAdapter(adapter); } }
ExpandableListView的显示内容由ExpandableListAdapter接口提供,想要实现这个接口就需要扩展
BaseExpandableListAdapter。代码中可以看到BaseExpandableListAdapter有很多个方法,其中几个比较
重要的方法有:
getGroupCount(),这个方法返回的是组列表项的数量
getGroupView(), 这个方法会返回一个View,来成为组列表项的样式
getChildrenCount(),每一列展开后的列表数量
getChildView(),每一列展开后的样式
最后来看看Spinner,这是一个列表选择框,点击后会看见列表的内容,选择其中一个会显示出来
布局文件如下
<Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" />
Java代码如下:
public class MainActivity extends AppCompatActivity { Spinner spinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner = (Spinner) findViewById(R.id.spinner); String[] arr={"444","555","666"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, arr); spinner.setAdapter(adapter); } }
spinner使用ArrayAdapter来提供列表项。