• Android中 ExpandableList的使用2


    Android中ExpandableList的使用2

    本文介绍Android中ExpandableList的使用,在前文的基础上作了很多改进,增加了增加、删除、回调等功能。

    图中的 “第一行班组号: 1  软件工程2班”是要显示的信息。

    先看效果图:

    首先定义一个含有ExpandableListView的Layout。还有一个是显示的文本信息。

    <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
        <ExpandableListView
            android:id="@+id/expandableListView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView1"
            android:layout_below="@+id/textView1"
            android:layout_marginTop="52dp" >
        </ExpandableListView>
    </RelativeLayout>
    

    2、为ExpandableListView准备数据源。

      ClassGroups列表,定义了所有的班级。

      ClassDetails定义班级的详细信息。包括班级编号,班级名称,班级人数,以及老师。

    private List<String> ClassGroups = new ArrayList<String>();
    
    	private List<List<String>> ClassDetails = new ArrayList<List<String>>();
    	private String[][] ClassDetailsSource = {
    			{ "20100801", "软件工程1班", "50", "王老师" },
    			{ "20100802", "软件工程2班", "47", "理老师" },
    			{ "20100803", "网络工程1班", "52" }, { "20100804", "计算机科学与技术" }
    
    	};
    

     通过addItem方法,初始化四个班级。

    	private void parepareDataSource() {
    		for (int i = 0; i < 4; i++) {
    			addItem("班组号:"+i, ClassDetailsSource[i]);
    		}
    	}
    

    将所有的班级添加的ClassDetails中。

    private void addItem(String string, String[] data) {
    		// TODO Auto-generated method stub
    		ClassGroups.add(string);
    		List<String> item = new ArrayList<String>();
    		for (int i = 0; i < data.length; i++) {
    			item.add(data[i]);
    		}
    		ClassDetails.add(item);
    	}
    

     3、使用BaseExpandableListAdapter绑定数据源。这个在我的上一篇文章中以及介绍过了,这里不在介绍。

    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		setContentView(R.layout.activity_main);
    		
    		parepareDataSource();
    	
    		tView = (TextView) findViewById(R.id.textView1);
    		expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
    
    		expandableListView.setAdapter(new ExpandableListAdapter());
    		
    		//ExpandableListView的回调函数 用于监听那个id 被expand
    		expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
    			
    			@Override
    			public boolean onGroupClick(ExpandableListView parent, View v,
    					int groupPosition, long id) {
    				// TODO Auto-generated method stub
    				Toast.makeText(ExpandableList3.this, "You Click " + groupPosition + " Group", Toast.LENGTH_LONG).show();
    				return false;
    			}
    		});
    	
    		expandableListView.setOnChildClickListener(new OnChildClickListener() {
    			
    			@Override
    			public boolean onChildClick(ExpandableListView parent, View v,
    					int groupPosition, int childPosition, long id) {
    				// TODO Auto-generated method stub
    				Toast.makeText(ExpandableList3.this, "You Click " + childPosition + " child in group" + groupPosition, Toast.LENGTH_LONG).show();
    				return false;
    			}
    		});
    		
    
    	}
    

    注:expandableListView.setOnGroupClickListener(new OnGroupClickListener())和expandableListView.setOnChildClickListener(new OnChildClickListener())是回调方法,等会再讲。

    下面是ExpandableListAdapter的数据源形式为:

    public class ExpandableListAdapter extends BaseExpandableListAdapter {		
    		@Override
    		public boolean isChildSelectable(int groupPosition, int childPosition) {
    			// TODO Auto-generated method stub
    			String string = ClassGroups.get(groupPosition)
    					+ ClassDetails.get(groupPosition).get(childPosition); 
    tView.setText(string); return true; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layout = new LinearLayout(ExpandableList3.this); layout.setOrientation(0); layout.setPadding(50, 0, 0, 0); ImageView imageView = new ImageView(ExpandableList3.this); imageView.setImageResource(R.drawable.ic_launcher); layout.addView(imageView); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); layout.addView(textView); return layout; } private TextView getTextView() { // TODO Auto-generated method stub AbsListView.LayoutParams lParams = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 64); TextView textView = new TextView(ExpandableList3.this); textView.setLayoutParams(lParams); textView.setPadding(20, 0, 0, 0); textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); return textView; } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public int getGroupCount() { // TODO Auto-generated method stub return ClassGroups.size(); } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return ClassGroups.get(groupPosition); } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return ClassDetails.get(groupPosition).size();
    } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return ClassDetails.get(groupPosition).get(childPosition); } };

    二、创建两个Menu,分别调用各自的方法,一个是创建班级dialog, 一个是创建删除Dialog. 分别对应增加班级信息和删除班级信息

    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		menu.add(Menu.NONE, Menu.FIRST + 1, 1, "Add").setIcon(
    				R.drawable.ic_launcher);
    		menu.add(Menu.NONE, Menu.FIRST + 2, 2, "Delete").setIcon(
    				R.drawable.ic_launcher);
    		return true;
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		switch (item.getItemId()) {
    		case Menu.FIRST + 1:
    			createAddDialog();
    			break;
    		case Menu.FIRST + 2:
    			createDeleteDialog();
    			break;
    		}
    		return false;
    
    	}
    

     1、增加的Layout add_item.xml如下:分别放了四个文本,和文本框,一个确定,一个取消按钮。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="班级号" />
    
            <EditText
                android:id="@+id/add_item1"
                android:layout_width="200dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dp" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="班级名" />
    
            <EditText
                android:id="@+id/add_item2"
                android:layout_width="200dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dp" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="班级人数" />
    
            <EditText
                android:id="@+id/add_item3"
                android:layout_width="200dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dp" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="老师" />
    
            <EditText
                android:id="@+id/add_item4"
                android:layout_width="200dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dp" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="ok" />
    
            <Button
                android:id="@+id/cancle"
                android:layout_width="200dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="cancle" />
        </LinearLayout>
    
    </LinearLayout>
    

     2、增加的代码如下:通过addItem(class_no.getText().toString(), data);方法,将添加班级信息。取消按钮时关闭当前Dialog.

    	private EditText class_no;
    	private EditText class_name;
    	private EditText stu_num;
    	private EditText teacher;
    	private Dialog addDialog;
    
    	public void createAddDialog() {
    		View addView = getLayoutInflater().inflate(R.layout.add_item, null);
    		addDialog = new Dialog(this);
    		addDialog.setContentView(addView);
    		addDialog.setTitle("Add class dialog");
    
    		class_no = (EditText) addView.findViewById(R.id.add_item1);
    		class_name = (EditText) addView.findViewById(R.id.add_item2);
    		stu_num = (EditText) addView.findViewById(R.id.add_item3);
    		teacher = (EditText) addView.findViewById(R.id.add_item4);
    
    		Button ok = (Button) addView.findViewById(R.id.ok);
    		Button cancle = (Button) addView.findViewById(R.id.cancle);
    		ok.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				String[] data = { class_no.getText().toString(),
    						class_name.getText().toString(), stu_num.getText().toString(),
    						teacher.getText().toString() };
    				addItem(class_no.getText().toString(), data);
    				addDialog.dismiss();
    
    			}
    
    		});
    		cancle.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				addDialog.dismiss();
    			}
    		});
    		addDialog.show();
    	}
    

    3、增加的效果图如下:

    4、同理删除的Layout为delete_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="删除的班组编号:" />
    
            <EditText
                android:id="@+id/delete_id"
                android:layout_width="200dip"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/delete"
                android:layout_width="90dip"
                android:layout_height="wrap_content"
                android:text="Delete" />
    
            <Button
                android:id="@+id/cancle_delete"
                android:layout_width="90dip"
                android:layout_height="wrap_content"
                android:text="Canlce" />
        </LinearLayout>
    
    </LinearLayout>
    

    5、 删除的代码为:输入编号: 如2, 则将班组号为2的班级所有信息删除。调用了ClassGroups.remove(i);ClassDetails.remove(i);方法。

    	Dialog deleteDialog;
    	EditText delete_group_id;
    
    	public void createDeleteDialog() {
    		View deleteView = getLayoutInflater().inflate(R.layout.delete_item,
    				null);
    		deleteDialog = new Dialog(this);
    		deleteDialog.setContentView(deleteView);
    		deleteDialog.setTitle("Delete class dialog");
    
    		delete_group_id = (EditText) deleteView.findViewById(R.id.delete_id);
    
    		Button ok = (Button) deleteView.findViewById(R.id.delete);
    		Button cancle = (Button) deleteView.findViewById(R.id.cancle_delete);
    		ok.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				String deleteId = delete_group_id.getText().toString();
    				if (!deleteId.equals("")) {
    					int i = Integer.parseInt(deleteId);
    					ClassGroups.remove(i);
    					ClassDetails.remove(i);
    				}
    				deleteDialog.dismiss();
    
    			}
    
    		});
    		cancle.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				deleteDialog.dismiss();
    			}
    		});
    		deleteDialog.show();
    	}
    

    6、删除的效果图如下:

     

    三、回调函数的使用。

    当单击组时,显示组的信息。单击子项的信息,显示组合子项的信息。如第一张图右下角显示的信息。

                       //ExpandableListView的回调函数 用于监听那个id 被expand
    		expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
    			
    			@Override
    			public boolean onGroupClick(ExpandableListView parent, View v,
    					int groupPosition, long id) {
    				// TODO Auto-generated method stub
    				Toast.makeText(ExpandableList3.this, "You Click " + groupPosition + " Group", Toast.LENGTH_LONG).show();
    				return false;
    			}
    		});
    	
    		expandableListView.setOnChildClickListener(new OnChildClickListener() {
    			
    			@Override
    			public boolean onChildClick(ExpandableListView parent, View v,
    					int groupPosition, int childPosition, long id) {
    				// TODO Auto-generated method stub
    				Toast.makeText(ExpandableList3.this, "You Click " + childPosition + " child in group" + groupPosition, Toast.LENGTH_LONG).show();
    				return false;
    			}
    		});
    

     ExpandableList的使用就介绍到这里。本文也是对自己学习情况的记录,方便以后再次学习。

    作者:Work Hard Work Smart
    出处:http://www.cnblogs.com/linlf03/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    MPSOC之5——开发流程BOOT.BIN
    MPSOC之6——开发流程linux编译
    MPSOC之1——overview、开发板、工具[转载]
    IC设计的前端和后端(转)
    [转载]深入理解JavaScript系列 --汤姆大叔
    xml的特殊字符
    JavaScript 对象
    knockoutjs关于ko.bindingHandlers的updata订阅
    单元测试 unittest 读取文件 (CSV, XML)
    单元测试 unittest 将断言结果生成测试报告
  • 原文地址:https://www.cnblogs.com/linlf03/p/2980959.html
Copyright © 2020-2023  润新知