Android Day06
Android中,全局变量以m开头,全局static变量以s开头
BaseAdapter复习
思路:
- 创建列表
- 找到列表
- (模拟)得到数据
- 创建适配器,将数据与列表联系起来(创建UserAdapter 继承 BaseAdapter)
getView()中,parent.getContext()得到的就是Activity的Context
重构UserAdapter:
抽取父类,将全局数据添加泛型,将修饰符改成protected,以便子类继承
此后只需要继承,然后重写getView()
ArrayAdapter
ArrayAdapter是BaseAdapter的子类
当想创建一个列表,每一个item只有一个TextView,这时就可以使用ArrayAdapter。
创建列表
找到列表
模拟数据
创建ArrayAdapter\ (一般使用String)
public class MainActivity extends Activity { private ListView listview; private List<String> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取数据列表 listview = (ListView) findViewById(R.id.main_lv); mDatas = new ArrayList<String>(); for (int i = 0; i < 30; i++) { mDatas.add("数据内容"+ i); } //创建adapter ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1,mDatas); listview.setAdapter(adapter); } }
SimpleAdapter
一点也不Simple
创建SimpleAdapter
- 创建数据传入SimpleAdapter–> 传入List
<ListView 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:id="@+id/mian_lv"/>
students_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_item" >
<TextView
android:id="@+id/name_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"/>
<TextView
android:id="@+id/grade_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/name_tv"
android:layout_alignLeft="@id/name_tv"
android:layout_marginTop="5dp"/>
<TextView
android:id="@+id/clazz_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/grade_tv"
android:layout_alignTop="@id/grade_tv"
android:layout_marginLeft="5dp"/>
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private ListView mSimplelv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSimplelv = (ListView) findViewById(R.id.mian_lv);
// 获取数据
ArrayList<HashMap<String, String>> datas = initViewData();
//创建SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter( this,
datas,
R.layout.students_item,
new String[] { "name", "grade", "class" },
new int[] {R.id.name_tv, R.id.grade_tv, R.id.clazz_tv });
mSimplelv.setAdapter(adapter);
}
// 初始化数据,然后抽取成一个方法。
private ArrayList<HashMap<String, String>> initViewData() {
//创建一个list保存所有学生对象
ArrayList<Students> students = new ArrayList<Students>();
//一共30个Students
for (int i = 0; i < 30; i++) {
students.add(new Students("name" + i, "grade:" + i, "class:" + i));
}
//此List中保存的每一个HashMap都要保存Students的3个字段,即Students对象不会直接传入Adapter
//这样做的好处是,提高代码的可复用性,而不是写死成Students再调用Students的方法
ArrayList<HashMap<String, String>> datas = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < students.size(); i++) {
Students student = students.get(i);
HashMap<String, String> itemData = new HashMap<String, String>();
itemData.put("name", student.getName());
itemData.put("grade", student.getGrade());
itemData.put("class", student.getClazz());
datas.add(itemData);
}
return datas;
}
}
Student.java
package com.mycompany.simpleadaptertest;
//一个简单的bean
public class Students {
private String name;
private String grade;
private String clazz;
public Students(String name, String grade, String clazz) {
this.name =name;
this.grade=grade;
this.clazz=clazz;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
ExpandableListView
- 双嵌套列表
组(组名):ArrayList groupName
子列表:HashMap<String groupName, ArrayList content> menbers
在layout中创建一个ExpandableListView的布局
BaseExpandableListAdapter:
getGroupCount(), getGroupView():省略
getChildrenCount()/getChildrenView:
//计算出是哪个组的
String groupName = mGroupNames.get(groupPosition);
//得到对应的子列表
ArrayList<String> child是= mMenbers.get(groupName);
/*在getChildrenCount()中,得到Children的size即可*/
//计算出是成员的第几项
String number = child.get(childPosition);
//初始化成员列表的布局
/* (省略)View打气筒、findViewById(android.R.layout.simple_*_text1)、View.setText*/
双嵌套列表监听器
//mGroupName为外部初始化的ArrayList数组,用于模拟数据
mExlv.setOnGroupClickListener(new OnGroupClickListener(){
//1.组的点击事件
//如果返回true就是告诉系统,我们处理了,不用等系统处理
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id){
Toast.makeText(MainActivity.this, groupName,
Toast.LENGTH_SHORT).SHOW();
return true;
}
});
//2.组的展开事件
mExlv.setGroupExpandableListener(new OnGroupExpandListener(){
public void onGroupExpand(int groupPosition){
String groupName = mGroupNames.get(groupPosition);
Toast.makeText(MainActivity.this, groupName+" 展开",
Toast.LENGTH_SHORT).show();
}
});
//3.组的收缩
mExlv.setGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
String groupName = mGroupNames.get(groupPosition);
Toast.makeText(MainActivity.this, groupName+" 收缩",
Toast.LENGTH_SHORT).show();
}
})
//4.子列表的点击,重写Expandable实现类中将isChildSelectable 返回为true;
mExlv.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent,
View v,
int groupPosition,
int childPosition,
long id) {
String groupName = mGroupNames.get(groupPosition);
//某个组对应的成员列表
ArrayList<String> members = mMembers.get(groupName);
String member = members.get(childPosition);
Toast.makeText(MainActivity.this, member, Toast.LENGTH_SHORT).show();
return false;
}
});
简单的ExpandableListView的使用
MainActivity.java
public class MainActivity extends Activity {
private ExpandableListView mExlv;
private ArrayList<String> mGroupNames;
private HashMap<String, ArrayList<String>> mMenbers;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initExLv();
//1.组的item的点击事件
mExlv.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
String msg = mGroupNames.get(groupPosition);
Toast.makeText(MainActivity.this, msg+"被点击", Toast.LENGTH_SHORT).show();
return false;
}
});
//2.组的展开事件
mExlv.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
String msg = mGroupNames.get(groupPosition);
Toast.makeText(MainActivity.this, msg+"展开", Toast.LENGTH_SHORT).show();
}
});
//3.组的收缩
mExlv.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
String msg = mGroupNames.get(groupPosition);
Toast.makeText(MainActivity.this, msg+"收起", Toast.LENGTH_SHORT).show();
}
});
//4.成员列表的item的点击事件
mExlv.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
String msg = mMenbers.get(mGroupNames.get(groupPosition)).get(childPosition);
Toast.makeText(MainActivity.this, msg+"被点击", Toast.LENGTH_SHORT).show();
return false;
}
});
}
private void initExLv() {
//模拟获得数据
mExlv = (ExpandableListView) findViewById(R.id.mian_exlv);
mGroupNames = new ArrayList<String>();
//此MAP用于储存子列表的全部item,以及子列表的父item名称
mMenbers = new HashMap<String, ArrayList<String>>();
for (int i = 0; i < 3; i++) {
mGroupNames.add("群组"+i);
}
for (int i = 0; i < mGroupNames.size(); i++) {
//value的List用于保存子列表的所有item,然后赋给HashMap
ArrayList<String> value = new ArrayList<String>();
value.add("|--成员1");
value.add("|--成员2");
value.add("|--成员3");
value.add("|--成员4");
mMenbers.put(mGroupNames.get(i), value);
}
MyExListAdapter adapter = new MyExListAdapter(mGroupNames, mMenbers);
mExlv.setAdapter(adapter);
}
}
MyExpandableListAdapter.java
public class MyExListAdapter extends BaseExpandableListAdapter {
private ArrayList<String> mGroupNames;
private HashMap<String, ArrayList<String>> mMenbers;
public MyExListAdapter(ArrayList<String> mGroupNames,
HashMap<String, ArrayList<String>> mMenbers) {
this.mGroupNames = mGroupNames;
this.mMenbers = mMenbers;
}
@Override
public int getGroupCount() {
return mGroupNames.size();
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
//先获得一个android提供的simple view
View itemView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
//将view中的textview找到
TextView groupName_tv = (TextView) itemView.findViewById(android.R.id.text1);
//给TextView添加文本信息,要将groupName_tv强转成textview。
groupName_tv.setText(mGroupNames.get(groupPosition));
return itemView;//此处要返回itemView,
}
//成员是否可以被选择
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public int getChildrenCount(int groupPosition) {
return mMenbers.get(mGroupNames.get(groupPosition)).size();
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext())
.inflate(android.R.layout.simple_list_item_1, parent, false);
TextView member_tv = (TextView) view.findViewById(android.R.id.text1);
//得到当前child的文本
String text = mMenbers.get(mGroupNames.get(groupPosition)).get(childPosition);
member_tv.setText(text);
return view;
}
}
Dialog
//弹出一个普通对话框
public void myClick(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("是否确定退出")
builder.setPositiveButton("继续",null);//积极按钮,不实现监听就传入null
builder.setNegativeButton("退出",null);//消极按钮
AlertDialog dialog = builder.create();
//以上内容可以采用链式书写
dialog.show();
}
private String[] mDatas = new String[]{"选项1","选项2","选项3"}
private int mTabIndex;//被选中了的索引
//弹出一个单选框
public void myClick(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setSingleChoiceItem(mDatas, mTabIndex, newOnClickListener(){
public void onCLick(DialogInterface dialog, int which){
mTabIndex = which;
}
});
builder.setPositiveButton("确定",new OnClickListener(){
public void onClick(DialogInterface dialog, int which){
/*toast操作*/
}
});
AlertDialog dialog = builder.create();
//以上内容可以采用链式书写
dialog.show();
}
//多选框 setMultiChoiceItems()
private boolean[] mFlags = new boolean[]{true, false, true};
private String mDatas = new String[]{"选项1","选项2","选项3"};
//加载框
public void myClick(View v){
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage("Loading");
dialog.show();
// dialog.dismiss(); 隐藏
}
PopupWindow
Dialog弹出框样式有限
private Button mBtn;
protected void onCreate(Bundle savedInstanceState){
/* 省略部分 */
mBtn = (Button)findViewById(/*省略*/);
mBtn.setOnClickListener(this)//在此类中实现
}
public void onClick(View v){
//1.将ListView布局转换成View
/* inflater 得到一个contentView */
//2.创建一个PopupWindow
PopupWindow popupWindow = new PopupWindow(contentView, 150/*pixel*/, 200);
//3.弹出框默认情况下,内部控件是无法获取焦点的
popupWindow.setFocusable(true);
//4.为了让外部控件获取焦点,需要让外面的控件能够触摸到
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroudDrawable(/*drawable*/)//只要添加了这一句就有效。
popupWindow.showAsDropDown(mBtn);
//popupWindow.showAsDropDown(anchor/*下拉定位控件*/) 下拉框显示
//popupWindow.showAtLocation(parent, grabvity, x, y) 在某个位置
}
简单使用测试
drawable/smooth_corner.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid
android:color="#ffff"/>
<corners android:radius="5dp"/>
<size android:width="20dp"
android:height="20dp"/>
<stroke android:width="2px"
android:color="#000"/>
</shape>
layout/mylistview.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mlv"
android:background="@drawable/smooth_corner"/>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener{
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = (Button) findViewById(R.id.popup_btn);
//给button设置点击事件,由当前类实现,需要让当前类实现OnClickListener接口
mBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//填充一个View,填充的是R.layout.XXX
View contentView = LayoutInflater.from(this).inflate(R.layout.mylistview, null, false);
//找到View中的item,R.id.XXX,两步不能合并
ListView lv = (ListView) contentView.findViewById(R.id.mlv);
ArrayList<String> datas = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
datas.add("item"+i);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, datas);
lv.setAdapter(adapter);
//声明一个PopupWindow,把填充的View传进去,focusable设置为true:可以点击
PopupWindow pw = new PopupWindow(contentView, 150, 200, true);
//设置,让PopupWindow外部也可以被点击
pw.setOutsideTouchable(true);
pw.setBackgroundDrawable(new BitmapDrawable());//此时必须要设置background才能生效,使用什么drawable无所谓
pw.showAsDropDown(mBtn);
}
}