赵雅智_AndroidUI_Android中listview可折叠伸缩仿手风琴效果(静态)

最近些一个名片夹得app。其中名片夹客户要求做成可折叠伸缩的效果,真是费了好大劲啊~~~啥都不说了看效果图吧~~

package com.cards.activity;

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

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.cards.R;

public class CardsListAct extends ListActivity implements OnScrollListener,
		OnItemClickListener {
	private static String LAYOUT_INFLATER_SERVICE = Context.LAYOUT_INFLATER_SERVICE;

	public static final String TV_CARDS_NAME = "tv_cards_name";
	public static final String TV_CARDS_PHONENUMINFO = "tv_cards_phoneNumInfo";
	public static final String TV_CARDS_ADDRESSINFO = "tv_cards_addressInfo";
	public static final String TV_CARDS_MAILINFO = "tv_cards_mailInfo";
	public static final String TV_CARDS_OTHERINFO = "tv_cards_otherInfo";
	public static final String TV_CARD_NAME = "tv_card_name";

	private LayoutInflater mInflater;

	private FlexListAdapter adapter;

	private List<Map<String, String>> contentDefileList;
	private boolean[] isCurrentItems;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mInflater = (LayoutInflater) this
				.getSystemService(LAYOUT_INFLATER_SERVICE);
		init();
		setListAdapter(adapter);
		getListView().setBackgroundColor(Color.WHITE);
		getListView().setCacheColorHint(Color.TRANSPARENT);
		getListView().setDivider(
				getResources().getDrawable(R.color.transparent));
		getListView().setSelector(R.drawable.work_detail_click_bg);
		getListView().setOnScrollListener(this);
		getListView().setOnItemClickListener(this);
	}

	/**
	 * 初始化数据
	 */
	private void init() {
		contentDefileList = new ArrayList<Map<String, String>>();

		Map<String, String> contentDefile = new HashMap<String, String>();
		contentDefile.put(TV_CARDS_NAME, "张三");
		contentDefile.put(TV_CARD_NAME, "张三");
		contentDefile.put(TV_CARDS_PHONENUMINFO, "13933333333");
		contentDefile.put(TV_CARDS_ADDRESSINFO, "保定市高开区朝阳北大街866号(保百购物广场南侧)");
		contentDefile.put(TV_CARDS_MAILINFO, "[email protected]");
		contentDefile.put(TV_CARDS_OTHERINFO, "部门经理");

		Map<String, String> contentDefile_1 = new HashMap<String, String>();
		contentDefile_1.put(TV_CARDS_NAME, "李四");
		contentDefile_1.put(TV_CARD_NAME, "李四");
		contentDefile_1.put(TV_CARDS_PHONENUMINFO, "13933333333");
		contentDefile_1.put(TV_CARDS_ADDRESSINFO, "保定市高开区朝阳北大街866号(保百购物广场南侧)");
		contentDefile_1.put(TV_CARDS_MAILINFO, "[email protected]");
		contentDefile_1.put(TV_CARDS_OTHERINFO, "经理");

		Map<String, String> contentDefile_2 = new HashMap<String, String>();
		contentDefile_2.put(TV_CARDS_NAME, "王五");
		contentDefile_2.put(TV_CARD_NAME, "王五");
		contentDefile_2.put(TV_CARDS_PHONENUMINFO, "13933333333");
		contentDefile_2.put(TV_CARDS_ADDRESSINFO, "hfdkajshfkadsjflkajsdlkf");
		contentDefile_2.put(TV_CARDS_MAILINFO, "[email protected]");
		contentDefile_2.put(TV_CARDS_OTHERINFO, "经理");

		Map<String, String> contentDefile_3 = new HashMap<String, String>();
		contentDefile_3.put(TV_CARDS_NAME, "vvv");
		contentDefile_3.put(TV_CARD_NAME, "vvv");
		contentDefile_3.put(TV_CARDS_PHONENUMINFO, "13933333333");
		contentDefile_3.put(TV_CARDS_ADDRESSINFO, "hfdkajshfkadsjflkajsdlkf");
		contentDefile_3.put(TV_CARDS_MAILINFO, "[email protected]");
		contentDefile_3.put(TV_CARDS_OTHERINFO, "设计师");
		Map<String, String> contentDefile_5 = new HashMap<String, String>();
		contentDefile_5.put(TV_CARDS_NAME, "bbb");

		Map<String, String> contentDefile_6 = new HashMap<String, String>();
		contentDefile_6.put(TV_CARDS_NAME, "ccc");
		contentDefile_6.put(TV_CARD_NAME, "ccc");

		Map<String, String> contentDefile_7 = new HashMap<String, String>();
		contentDefile_7.put(TV_CARDS_NAME, "ddd");
		contentDefile_7.put(TV_CARD_NAME, "ddd");

		Map<String, String> contentDefile_4 = new HashMap<String, String>();
		contentDefile_4.put(TV_CARDS_NAME, "aaa");
		contentDefile_4.put(TV_CARD_NAME, "aaa");

		contentDefileList.add(contentDefile);
		contentDefileList.add(contentDefile_1);
		contentDefileList.add(contentDefile_2);
		contentDefileList.add(contentDefile_3);
		contentDefileList.add(contentDefile_4);
		contentDefileList.add(contentDefile_6);
		contentDefileList.add(contentDefile_7);

		isCurrentItems = new boolean[contentDefileList.size()];

		for (int i = 0; i < isCurrentItems.length; i++) {

			isCurrentItems[i] = false;
		}

		Log.w("TAG", "AutoLoadActivity init() =========>>>>>> come in.");
		adapter = new FlexListAdapter();
	}

	public void onScroll(AbsListView v, int i, int j, int k) {
	}

	public void onScrollStateChanged(AbsListView v, int state) {
		if (state == OnScrollListener.SCROLL_STATE_IDLE) {
		}
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		if (isCurrentItems[position]) {
			isCurrentItems[position] = false;
		} else {
			isCurrentItems[position] = true;
		}
		// 即时刷新
		adapter.notifyDataSetChanged();
	}

	class FlexListAdapter extends BaseAdapter {
		int count = contentDefileList.size();

		public int getCount() {
			return count;
		}

		public Object getItem(int pos) {
			return pos;
		}

		public long getItemId(int pos) {
			return pos;
		}

		public View getView(int pos, View v, ViewGroup p) {
			FlexLinearLayout view = null;
			if (null == v) {
				view = new FlexLinearLayout(CardsListAct.this,
						contentDefileList.get(pos), pos, false);
			} else {
				view = (FlexLinearLayout) v;
				view.setWorkTitleLayout(contentDefileList.get(pos), pos,
						isCurrentItems[pos]);
			}
			return view;
		}
	}

	public class FlexLinearLayout extends LinearLayout {
		public static final int BULE = 0xFF3D8CB8;

		private LinearLayout layout;

		private RelativeLayout rlName;

		private RelativeLayout llCards;

		private TextView tvCardsPhoneNumInfo;

		private TextView tvCardsAddressInfo;

		private TextView tvCardsMailInfo;

		private TextView tvCardsOtherInfo;

		private TextView tvCardsName;
		private TextView tvCardName;

		/**
		 * 创建一个带有伸缩效果的LinearLayout
		 *
		 * @param context
		 * @param contextDefail
		 *            内容详细
		 * @param position
		 *            该列所在列表的位置
		 * @param isCurrentItem
		 *            是否为伸展
		 */
		public FlexLinearLayout(Context context,
				final Map<String, String> contextDefail, final int position,
				boolean isCurrentItem) {
			super(context);

			layout = (LinearLayout) mInflater.inflate(R.layout.act_cards_list,
					null);
			rlName = (RelativeLayout) layout.findViewById(R.id.rl_name);
			llCards = (RelativeLayout) layout.findViewById(R.id.ll_cards);

			tvCardsPhoneNumInfo = (TextView) layout
					.findViewById(R.id.tv_cards_phoneNumInfo);
			tvCardsName = (TextView) layout.findViewById(R.id.tv_cards_name);
			tvCardName = (TextView) layout.findViewById(R.id.tv_card_name);

			tvCardsAddressInfo = (TextView) layout
					.findViewById(R.id.tv_cards_addressInfo);
			tvCardsMailInfo = (TextView) layout
					.findViewById(R.id.tv_cards_mailInfo);
			tvCardsOtherInfo = (TextView) layout
					.findViewById(R.id.tv_cards_otherInfo);

			this.addView(layout);
			setWorkTitleLayout(contextDefail, position, isCurrentItem);
		}

		/**
		 * 设置该列的状态及样式
		 *
		 * @param contentDefail
		 *            内容详细
		 * @param position
		 *            该列所在列表的位置
		 * @param isCurrentItem
		 *            是否为伸展
		 */
		public void setWorkTitleLayout(final Map<String, String> contentDefail,
				final int position, boolean isCurrentItem) {

			rlName.setBackgroundResource((position % 2 == 1) ? R.drawable.title_1
					: R.drawable.title_2);

			tvCardsName.setText(contentDefail.get(TV_CARDS_NAME));

			tvCardsName.setTextColor((position % 2 == 0) ? BULE : Color.WHITE);

			if (isCurrentItem) {
				Log.d("TAG", "isCurrentItem ============>>>>>>>>>  " + position);
				tvCardsPhoneNumInfo.setText("电话:"
						+ contentDefail.get(TV_CARDS_PHONENUMINFO));
				tvCardsMailInfo.setText("邮箱:"
						+ contentDefail.get(TV_CARDS_MAILINFO));
				tvCardsAddressInfo.setText("地址:"
						+ contentDefail.get(TV_CARDS_ADDRESSINFO));
				tvCardsOtherInfo.setText(contentDefail.get(TV_CARDS_OTHERINFO));
				tvCardName.setText(contentDefail.get(TV_CARD_NAME));
			}

			llCards.setVisibility(isCurrentItem ? VISIBLE : GONE);
		}
	}

}

act_cards_list布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/rl_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/transparent" >

        <TextView
            android:id="@+id/tv_cards_name"
            style="@style/cards_item_title"
            android:text="路人甲" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/ll_cards"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/iv_card_list_bg"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/ll_cards_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip" >

            <TextView
                android:id="@+id/tv_card_name"
                style="@style/work_detail_row_style"
                android:text="路人甲"
                android:textSize="15sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/tv_mc_otherInfo"
                style="@style/work_detail_row_style"
                android:text="财务总监"
                android:textColor="@color/blue"
                android:textSize="10dp" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_cards_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/ll_cards_name"
            android:orientation="vertical"
            android:layout_marginTop="20dp">

            <TextView
                android:id="@+id/tv_mc_phoneNum"
                style="@style/work_detail_row_style"
                android:text="18933333333" />

            <TextView
                android:id="@+id/tv_mc_mail"
                style="@style/work_detail_row_style"
                android:text="[email protected]" />

            <TextView
                android:id="@+id/tv_mc_addressInfo"
                style="@style/work_detail_row_style"
                android:layout_width="171dp"
                android:layout_centerInParent="true"
                android:text="保定市高开区朝阳北大街866号(保百购物广场南侧)" />
        </LinearLayout>

</RelativeLayout>

</LinearLayout>
时间: 2024-10-29 14:16:52

赵雅智_AndroidUI_Android中listview可折叠伸缩仿手风琴效果(静态)的相关文章

赵雅智_AndroidUI_Android中listview可折叠伸缩仿手风琴效果(动态)

之前写了一篇静态数据listview显示手风琴效果,今天写的博客是动态实现listview的手风琴效果 静态链接:listview静态手风琴效果 数据都是存储在数据库中的,如果想要获取数据就要查询数据库 并且实现了:点击查看想要看的名片的时候,上一个打开的就能关闭 核心代码如下: package com.cards.activity; import java.util.List; import android.app.Activity; import android.app.AlertDialo

赵雅智:android教学大纲

带下划线为具体内容链接地址,点击后可跳转,希望给大家尽一些微薄之力,目前还在整理中 教学章节 教学内容 学时安排 备注 1 Android快速入门 2 Android模拟器与常见命令 3 Android用户界面设计 4 Android网络通信及开源框架引用 5 线程与消息处理 6 数据存储及访问 7 Android基本单元应用activity 8 Android应用核心Intent 9 资源访问 10 ContentProvider实现数据共享 11 BroadcastReceiver 12 S

赵雅智_android实例_当监听类有数据更新时下拉刷新

之前两篇文章分别介绍了OnScrollListener的实现和ContentProvider监听数据的变化,下面我们就结合者两个知识点实现一个小项目 项目需求 使用当ContentProvider监听类有数据更新时,在当前界面进行提示,并用OnScrollListener实现下拉刷新 实现效果 通过ContentProvider显示数据在界面 当监听类发生变化时 下拉刷新后显示数据 实现步骤 android_sqlite项目 定义操作标识 匹配结果码 继承ContentProvider类重写方法

赵雅智_Fragment

当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类.Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期. 多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),而这个类可以对这些Fragment进行配置以适应不同的屏

赵雅智_Tween动画(旋转、平移、放缩和渐变)

Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). Tweene Animations. 主要类 Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 TranslateAnimation 位置移动 AnimationSet  动画集 该View很简单,画面上只有一个图片. 现在我们要对整个View分别实现各种Tween动画效果. AlphaAnim

赵雅智_ListView_BaseAdapter

Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法. Android中Adapter类其实就是把数据源绑定到指定的View上,然后再返回该View,而返回来的这个View就是ListView中的某一行item. 这里返回来的View正是由我们的Adapter中的getView方法返回的.这样就会容易理解数据是怎样一条一条显示在ListView中的. 具体事例: 数据库我们还使用之前创建的 布局文

赵雅智_BaseAdapter

Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法. Android中Adapter类其实就是把数据源绑定到指定的View上,然后再返回该View,而返回来的这个View就是ListView中的某一行item. 这里返回来的View正是由我们的Adapter中的getView方法返回的.这样就会容易理解数据是怎样一条一条显示在ListView中的. 具体事例: 数据库我们还使用之前创建的 布局文

赵雅智_Android_Canvas

Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0. android.graphics和android.graphics.drawable包 大部分2D使用的api都在android.graphics和android.graphics.drawable包中. 他们提供了图形处理相关的: Canvas.ColorFilter.Point(点)和RetcF(矩形)等 还有一些动画相关的:AnimationDrawable. Bit

赵雅智_service生命周期

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 服务的开发步骤 第一步:继承Service类 public class SMSService extends Service { } 第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置: <service android:name=".SMSService" />