ExpanableListVIew一个奇妙的“手风琴”

ExpanableListView是android世界里的神话级别的组件,我个人是这样认为的,几乎在大部分的应用上都能看到它的影子。为了更好的让大家了解什么是ExpanableListView,本人小试牛刀自己写了一个ExpanableListView;话不多说上代码:

Campsite_expanable_list.java

import java.util.ArrayList;

import linkertimes.androidplatform.R;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.TextView;

public class Campsite_expanable_list extends Activity {
	// 声明listView和adapter;
	private ExpandableListView elv;
	private CamAdapter_list adapter;
	
	// 声明对象;
	private Button nine_btn;
	private Button list_btn;
	private TextView camName_tv;
	
	// 获取作品图片,获取参加的人数;
	private ArrayList<Drawable> get_img_drawable_list;
	private ArrayList<String> get_joinNum_list;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.cam_list);
		
		// 调用方法进行初始化;
		init();
		
		// 获取Intent传过来的营地的信息;
		Intent in = this.getIntent();
		String camName_list = in.getStringExtra("camName");
		camName_tv.setText(camName_list);
		
		// 获取资源库控制类;
		Resources res = this.getResources();
		
		
		get_img_drawable_list.add(res.getDrawable(R.drawable.beauty));
		get_img_drawable_list.add(res.getDrawable(R.drawable.beauty));
		get_img_drawable_list.add(res.getDrawable(R.drawable.beauty));

		get_joinNum_list.add(res.getString(R.string.joinNum));
		get_joinNum_list.add(res.getString(R.string.joinNum));
		get_joinNum_list.add(res.getString(R.string.joinNum));

		// 初始化adapter;
		adapter = new CamAdapter_list(this, get_img_drawable_list, get_joinNum_list);
		
		// 对listView设置;
		elv.setAdapter(adapter);
		elv.setGroupIndicator(res.getDrawable(R.drawable.indicator));
		elv.setIndicatorBounds(300, 320);
		elv.setDivider(null);
		
		// 展开listView的所有group分组;
		expandAllGroups(elv,CamAdapter_list.ACTIVITYNUMS);
		
		// 设置按钮的监听;
		nine_btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Campsite_expanable_list.this.finish();
			}
		});
	}

	private void init() {
		// 初始化listView;
		elv = (ExpandableListView) this.findViewById(R.id.explv);
		
		// 初始化ArrayList;
		get_img_drawable_list = new ArrayList<Drawable>();
		get_joinNum_list = new ArrayList<String>();

		// 初始化按钮;
		nine_btn = (Button) this.findViewById(R.id.ninego_button_list);
		list_btn = (Button) this.findViewById(R.id.list_button_list);
		list_btn.setBackgroundResource(R.drawable.list_pressed);
		camName_tv = (TextView) this.findViewById(R.id.camName_list);
	}
	 
	/**
	 * 用于展开所有的listView的group的方法;
	 * @param elv 被操作的对象实例;
	 * @param groupCount elv中所包含的group的个数;
	 */
	public static void expandAllGroups(ExpandableListView elv,int groupCount){
		for(int i=0;i<groupCount;i++)
		{
			elv.expandGroup(i);
		}
	}
}


下面是xml布局文件部分:

cam.list.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        android:id="@+id/cam_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/pk_surface_bg" >

        <Button
            android:id="@+id/newPerson_enterButton_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="5dp"
            android:background="@drawable/enter_cam_selector" />

        <TextView
            android:id="@+id/camName_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="15dp"
            android:text="@string/fashion_campsite"
            android:textColor="#960068"
            android:textSize="20dp" />

        <Button
            android:id="@+id/ninego_button_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/newPerson_enterButton_list"
            android:layout_marginLeft="30dp"
            android:layout_toRightOf="@+id/camName_list"
            android:background="@drawable/nine_ge" />

        <Button
            android:id="@+id/list_button_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/ninego_button"
            android:layout_alignBottom="@+id/ninego_button_list"
            android:layout_toRightOf="@+id/ninego_button_list"
            android:background="@drawable/list" />

        <ExpandableListView
            android:id="@+id/explv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="53dp"
            android:fadingEdge="none"
            android:scrollbars="none"
       		>
        </ExpandableListView>
    </RelativeLayout>

</RelativeLayout>


适配器部分:

CamAdapter_list.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import linkertimes.androidplatform.R;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CamAdapter_list extends BaseExpandableListAdapter {

	public final static int ACTIVITYNUMS = 5;
	ArrayList<Drawable> img;
	ArrayList<String> info;
	Context context;
	ArrayList<String> groupList;
	ArrayList<List<Map<String, Object>>> childList;
	String[] title;

	CamAdapter_list(Context context, ArrayList<Drawable> img,
			ArrayList<String> info) {
		this.img = img;
		this.info = info;
		this.context = context;
		
		// 初始化ArrayList;
		groupList = new ArrayList<String>();
		childList = new ArrayList<List<Map<String, Object>>>();
		
		// 初始化一个数组;
		title = new String[] { "HOT", "New", "Voted", "Joined", "Friend's" };
		
		// 为ArrayList添加数据;
		for (int i = 0; i < ACTIVITYNUMS; i++) {
			groupList.add(title[i]);
			List<Map<String, Object>> children = new ArrayList<Map<String, Object>>();
			for (int j = 0; j < img.size(); j++) {
				Map<String, Object> map = new HashMap<String, Object>();
				children.add(map);
				map.put("img", img.get(j));
				Log.e("img-->", img.get(j)+"");
				map.put("info", info.get(j));
			}
			
			// 与父亲同一层;
			childList.add(children);
		}
	}

	@Override
	public Object getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childList.get(groupPosition).get(childPosition).get("img");
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childPosition;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition, boolean arg2,
			View convertView, ViewGroup arg4) {
		// TODO Auto-generated method stub
		if (convertView == null) {
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.adpter_child_layout, null);
		}
		TextView info = (TextView) convertView.findViewById(R.id.child_tv);
		info.setText(childList.get(groupPosition).get(childPosition).get("info").toString());
		ImageView img = (ImageView) convertView.findViewById(R.id.child_img);
		img.setImageDrawable((Drawable) childList.get(groupPosition).get(childPosition).get("img"));
		return convertView;
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		return childList.get(groupPosition).size();
	}

	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return groupList.get(groupPosition);
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return groupList.size();
	}

	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	@Override
	public View getGroupView(int groupPosition, boolean arg1, View convertView,
			ViewGroup arg3) {
		// TODO Auto-generated method stub
		if (convertView == null) {
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.adpter_group_layout, null);
		}
		TextView tv = (TextView) convertView.findViewById(R.id.group_tv);
		tv.setText(groupList.get(groupPosition).toString());
		return convertView;
	}

	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isChildSelectable(int arg0, int arg1) {
		// TODO Auto-generated method stub
		return false;
	}

}

以上就是本实例的主要源码,希望对大家的学习有所帮助暂时搁笔了。谢谢大家的支持,如果我写的还好希望大家给顶一下谢谢了!!!

抱歉,作为语言模型,我无法提供代码。但是,我可以为您提供一些指导,以帮助您开始编写手风琴。 首先,您需要使用HTML和CSS来创建手风琴的结构和样式。以下是一个简单的手风琴结构示例: ``` <div class="accordion"> <div class="accordion-group"> <div class="accordion-header">Section 1</div> <div class="accordion-content">Content for section 1</div> </div> <div class="accordion-group"> <div class="accordion-header">Section 2</div> <div class="accordion-content">Content for section 2</div> </div> <div class="accordion-group"> <div class="accordion-header">Section 3</div> <div class="accordion-content">Content for section 3</div> </div> </div> ``` 在上面的示例中,我们使用一个包含多个“accordion-group”的“accordion”容器。每个“accordion-group”包含一个标题(“accordion-header”)和内容(“accordion-content”)。我们将使用CSS来隐藏所有内容,除了当前打开的“accordion-group”的内容。 接下来,我们需要使用CSS来设置手风琴的样式。以下是一个简单的CSS示例: ``` .accordion-header { background-color: #eee; padding: 10px; cursor: pointer; } .accordion-header:hover { background-color: #ccc; } .accordion-content { display: none; padding: 10px; } .accordion-group.active .accordion-content { display: block; } ``` 在上面的示例中,我们为“accordion-header”和“accordion-content”添加了一些基本样式。我们使用“display: none”隐藏了所有“accordion-content”,除非其父元素(“accordion-group”)具有“active”类,否则它们将不可见。 最后,我们需要使用JavaScript来处理手风琴的交互。以下是一个简单的JavaScript示例: ``` var accordionGroups = document.querySelectorAll('.accordion-group'); accordionGroups.forEach(function(group) { var header = group.querySelector('.accordion-header'); var content = group.querySelector('.accordion-content'); header.addEventListener('click', function() { accordionGroups.forEach(function(group) { group.classList.remove('active'); }); group.classList.add('active'); }); }); ``` 在上面的示例中,我们使用“querySelectorAll”选择所有“accordion-group”,然后将事件侦听器添加到每个“accordion-header”。当用户单击标题时,我们将删除其他所有“active”类,并将其添加到当前“accordion-group”,以显示其内容。 希望这些指导可以帮助您开始编写手风琴
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值