一、 ListView 的分块显示和右侧导航
分块显示的应用场合:
1.要求数据有序
2.数据两不大,适合一次加载。
ListView 中数据的右侧导航
右侧导航一般建立在分块显示的基础上,同时会再添加一个listview显示对应的字母,点击字母时,定位其它listview中item的位置。
例子1:ListView分块显示及右边导航列
ContactActivity |
public class ContactActivity extends ListActivity implements OnItemClickListener { ContactDao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setContentList(); setRightList(); } private ContactAdapter cAdapter; private void setContentList() { dao=new ContactDao(this); List<Contact> contacts=dao.getContacts(); //对集合元素进行排序 Collections.sort(contacts,new Comparator<Contact>() { @Override 对字符串进行排序 public int compare(Contact lhs, Contact rhs) { return lhs.getName().compareTo(rhs.getName()); } }); //1.获得ListView //2.构建Adapter //3.关联Adapter cAdapter=new ContactAdapter(this,R.layout.contact_item_3,contacts); setListAdapter(cAdapter); } private void setRightList(){右边导航页 Character []array=new Character[26]; int i=0; for(char c='A';c<='Z';c++,i++){ 快速创建一个字符数组 array[i]=c; } //1.listview ListView lsv=(ListView) findViewById(R.id.rightLsv); //2.adapter ArrayAdapter<Character> adapter=new ArrayAdapter<Character>(this, R.layout.right_item_1, array); //3.关联adapter lsv.setAdapter(adapter); //4.添加点击事件 lsv.setOnItemClickListener(this); }
@Override protected void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(this, "进入联系人页面", 1).show(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position,long id) { //获得点击的item对象内容(对应联系人的section) Character c=(Character)parent.getItemAtPosition(position); //根据联系人的section找到最小的position int pos=cAdapter.getPositionForSection(c); //设置联系人列表顶端位置 getListView().setSelectionFromTop(pos,0);//其中0为y轴偏移量 } } |
ContactAdapter |
public class ContactAdapter extends BaseAdapter{
private Context context; private int resource; private List<Contact> list; public ContactAdapter(Context context,int resource,List<Contact> list){ this.context=context; this.resource=resource; this.list=list; } @Override public int getCount() { return list.size(); }
@Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //1.item view View v=null; ViewHolder vh=null; if(convertView==null){ v=View.inflate(context, resource, null); vh=new ViewHolder(); vh.photoIv=(ImageView) v.findViewById(R.id.logo); vh.nameTv=(TextView) v.findViewById(R.id.titleId); vh.phoneTv=(TextView) v.findViewById(R.id.dateId); vh.signTv=(TextView) v.findViewById(R.id.sign); v.setTag(vh); }else{ v=convertView; vh=(ViewHolder)v.getTag(); } //2. item data Contact c=list.get(position); //3. set item data to item view vh.photoIv.setImageURI(Uri.fromFile(new File(c.getPhoto()))); vh.nameTv.setText(c.getName()); vh.phoneTv.setText(c.getPhone()); vh.signTv.setText(String.valueOf(c.getName().toUpperCase().charAt(0))); 字符设置成 //4.显示或隐藏signTv 字符串 //4.1找到对应位置的section(块) int section=//对应字符的ASCII码值 getSectionForPosition(position); //4.2找到section在listview中的最小位置 int minPos=getPositionForSection(section); 只显示第一个 //4.3判定当前位置是否为minPos if(position==minPos){ vh.signTv.setVisibility(View.VISIBLE); }else{ vh.signTv.setVisibility(View.GONE); 消失后,后面会跟上 } return v; } public int getPositionForSection(int section){ for(int i=0;i<list.size();i++){ 在有序的基础上,遇到第一个就返回 int sec=getSectionForPosition(i); if(sec==section){ return i;//minPos } } return -1; } private int getSectionForPosition(int pos){ return list.get(pos).getName() .toUpperCase() .charAt(0); } class ViewHolder{ ImageView photoIv; TextView nameTv; TextView phoneTv; TextView signTv; } } |
二、ExpandableListView 的应用
ExpandableListView是一个特殊的ListView,能够实现展开或收起的功能(例如qq的我的好友,我的同学,。。。。)。
当我们需要默认展开或收起某个分组时,可
参考如下两个方法:
1)expandGroup
2)collapseGroup
ExpandableListView 应用中涉及的API:
1)ExpandableListActivity
2)ExpandableListAdapter
3)BaseExpandableListAdapter
4).......
例子2:ExpandableListView实现展开或收起
MainActivity |
public class MainActivity extends Activity {
String groups[]={"A","B","C"}; String childs[][]={{"A1","A2"},{"B1","B2"},{"C1","C2","C3"}}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.ExpandableListView ExpandableListView lsv=(ExpandableListView)findViewById(R.id.lsvId); //2.Adapter EAdapter adapter=new EAdapter(); //3.关联adapter lsv.setAdapter(adapter); //默认展开第一个分组 lsv.expandGroup(0);//0为要展开的分组 //lsv.collapseGroup(0);(收起) } class EAdapter extends BaseExpandableListAdapter{ //getCount @Override public int getGroupCount() { return groups.length; } @Override public int getChildrenCount(int groupPosition) { return childs[groupPosition] .length; } //getItem @Override public Object getGroup(int groupPosition) { return groups[groupPosition]; } //getItem @Override public Object getChild(int groupPosition, int childPosition) { return childs[groupPosition][childPosition]; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //表示item对应的id是否是稳定的,false表示不稳定 @Override public boolean hasStableIds() { return false; } //getView @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { //1.item view TextView v=(TextView) View.inflate(MainActivity.this, android.R.layout.simple_expandable_list_item_1, null); //2.item data String gname=groups[groupPosition]; //3.set item data add to item view v.setText(gname); 多写两个getview方法 return v; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { //1.item view TextView v=(TextView) View.inflate(MainActivity.this, android.R.layout.simple_list_item_1, null); //2.item data String cname=childs[groupPosition][childPosition]; //3.set item data add to item view v.setText(cname); return v; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true;//false表示不可选择 } } } |
三、GridView 的应用
GridView是一个以网格形式显示数据的Adapter
Layout对象。
GridView 常用属性:
1)numColumns (列的数量)
2)horizontalSpacing (水平间隙)
3)verticalSpacing (垂直间隙)
4)stretchMode (列宽剩余空间的应用模式,需结合columnWidth属性一起使用)
5)columnWidth(列的宽度)
例子3:GridView以网格形式显示数据(相册)
public class MainActivity extends Activity implements OnItemClickListener {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获得指定路径的图片 File sdcard=new File("/mnt/sdcard"); File pngs[]=sdcard.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile()&&file.getName().endsWith(".png"); } }); //1.获得GridView GridView gv=(GridView) findViewById(R.id.gvId); //2.构建适配器对象 ArrayAdapter<File> adapter= new ArrayAdapter<File>(this,R.layout.grid_item_1,pngs){ @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout v=(LinearLayout) View.inflate(getContext(), R.layout.grid_item_1, null); ImageView iv=(ImageView) v.findViewById(R.id.imgId); iv.setImageURI(Uri.fromFile(getItem(position))); return v; } }; //3.关联适配器 gv.setAdapter(adapter);//ListAdapter //4.添加监听器 gv.setOnItemClickListener(this); }
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //1.构建Intent对象 Intent intent=new Intent(this,OtherActivity.class); //2.封装数据 GridView上添加的监听器与ListView类似。 File f=(File)parent.getItemAtPosition(position); intent.putExtra("path",f.getPath()); //3.传递intent startActivity(intent); } } |
四、Spinner 下拉列表
Spinner 是以下拉列表的形式显示数据的一个
Adapter Layout对象。
Spinner对象常用方法:
1)getSelectedItem
2)......
例子4:Spinner 下来框选择
public class MainActivity extends Activity { Spinner sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.获得Spinner对象 sp=(Spinner)findViewById(R.id.spinner); //2.构建适配器对象 ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, new String[]{"博士","硕士","学士","大学"}); <!-- java: R.array.items --> //3.关联Adapter对象 sp.setAdapter(adapter); } public void onClick(View v){ //获得spinner中选中的值 String item=sp.getSelectedItem().toString(); Toast.makeText(this, item, 1).show(); } } |
定义字符数组
<!-- 定义一个数组(strings.xml) --> <string-array name="items"> <item>博士</item> <item>硕士</item> <item>学士</item> </string-array> <!-- java: R.array.items --> |