Android Day06

Android Day06

Android中,全局变量以m开头,全局static变量以s开头

BaseAdapter复习

思路:

  1. 创建列表
  2. 找到列表
  3. (模拟)得到数据
  4. 创建适配器,将数据与列表联系起来(创建UserAdapter 继承 BaseAdapter)

getView()中,parent.getContext()得到的就是Activity的Context

重构UserAdapter:

抽取父类,将全局数据添加泛型,将修饰符改成protected,以便子类继承

此后只需要继承,然后重写getView()

ArrayAdapter

ArrayAdapter是BaseAdapter的子类

当想创建一个列表,每一个item只有一个TextView,这时就可以使用ArrayAdapter。

  1. 创建列表

  2. 找到列表

  3. 模拟数据

  4. 创建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

  1. 创建数据传入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(); 隐藏
}

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值