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

之前写了一篇静态数据listview显示手风琴效果,今天写的博客是动态实现listview的手风琴效果

静态链接:listview静态手风琴效果

数据都是存储在数据库中的,如果想要获取数据就要查询数据库

并且实现了:点击查看想要看的名片的时候,上一个打开的就能关闭

核心代码如下:

package com.cards.activity;

import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.cards.R;
import com.cards.commom.Common;
import com.cards.commom.MyApp;
import com.cards.dao.CardDao;
import com.cards.dao.CardDaoImp;
import com.cards.entity.Card;

public class CardsListAct extends Activity implements OnItemClickListener {

	private FlexListAdapter adapter;
	private List<Card> list;
	private boolean[] isCurrentItems;
	private ListView lv_cards;
	private Button btnRegistered;
	private TextView tvTitle;

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.act_cardlist);
		lv_cards = (ListView) findViewById(R.id.list_cards);
		lv_cards.setSelector(R.color.transparent);
		// 初始化数据
		init();

	}

	/**
	 *
	 * @explaination 初始化数据
	 * @author yazhizhao
	 * @time 2014-7-23上午11:30:12
	 */
	private void init() {
		// 查找数据库数据
		CardDao cardDao = new CardDaoImp(this);
		list = cardDao.findAll();
		// 是否点开的list集合
		isCurrentItems = new boolean[list.size()];
		// 刚进入的时候全部条目显示闭合状态
		for (int i = 0; i < isCurrentItems.length; i++) {

			isCurrentItems[i] = false;
		}
		// 设置adapter
		adapter = new FlexListAdapter();
		lv_cards.setAdapter(adapter);
		lv_cards.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		/*
		 * 只打开一个
		 */
		for (int i = 0; i < isCurrentItems.length; i++) {
			if (i != position) {
				isCurrentItems[i] = false;
			}

		}
		// 打开或者合上
		isCurrentItems[position] = !isCurrentItems[position];
		// 即时刷新
		adapter.notifyDataSetChanged();
	}

	/**
	 *
	 * @explaination 自定义adapter
	 * @author yazhizhao
	 * @time 2014-7-23上午11:33:39
	 */
	class FlexListAdapter extends BaseAdapter {
		public int getCount() {
			return list.size();
		}

		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, list.get(pos),
						pos, false);
			} else {
				view = (FlexLinearLayout) v;
				view.setWorkTitleLayout(list.get(pos), pos, isCurrentItems[pos]);
			}
			return view;
		}
	}

	/**
	 *
	 * @explaination 自定义线性布局
	 * @author yazhizhao
	 * @time 2014-7-23上午11:25:07
	 */
	public class FlexLinearLayout extends LinearLayout {
		public static final int BULE = 0xFF3D8CB8;

		private LinearLayout layout;

		private RelativeLayout rlName;

		private RelativeLayout rlCards;

		private TextView tvCardsPhoneNumInfo;

		private TextView tvCardsAddressInfo;
		private TextView tvCardsMailInfo;
		private TextView tvCardsOtherInfo;
		private TextView tvCardsName;
		private TextView tvCardName;

		private ImageView imgCardsDel;
		private LayoutInflater mInflater;

		/**
		 * 创建一个带有伸缩效果的LinearLayout
		 *
		 * @param context
		 *            上下文对象
		 * @param card
		 *            内容详细
		 * @param position
		 *            该列所在列表的位置
		 * @param isCurrentItem
		 *            是否为伸展
		 */
		public FlexLinearLayout(final Context context, final Card card,
				final int position, boolean isCurrentItem) {
			super(context);

			mInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			layout = (LinearLayout) mInflater.inflate(R.layout.act_cards_list,
					null);
			rlName = (RelativeLayout) layout.findViewById(R.id.rl_name);
			rlCards = (RelativeLayout) layout.findViewById(R.id.rl_cards);
			tvCardsPhoneNumInfo = (TextView) layout
					.findViewById(R.id.tv_mc_phoneNum);
			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_mc_addressInfo);
			tvCardsMailInfo = (TextView) layout.findViewById(R.id.tv_mc_mail);
			tvCardsOtherInfo = (TextView) layout
					.findViewById(R.id.tv_mc_otherInfo);
			imgCardsDel = (ImageView) layout.findViewById(R.id.iv_cards_del);
			tvCardsPhoneNumInfo.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					String phone_Num = tvCardsPhoneNumInfo.getText().toString()
							.trim();

					Intent intent = new Intent(Intent.ACTION_CALL, Uri
							.parse("tel:" + phone_Num));

					startActivity(intent);

				}
			});
			imgCardsDel.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					Builder builder = new AlertDialog.Builder(CardsListAct.this);
					builder.setMessage("确定要删除此名片?")
							.setCancelable(false)
							.setPositiveButton("确认",
									new DialogInterface.OnClickListener() {
										public void onClick(
												DialogInterface dialog, int id) {
											CardDao cardDao = new CardDaoImp(
													context);
											cardDao.delete(card.getId());

											init();
										}
									})
							.setNegativeButton("取消",
									new DialogInterface.OnClickListener() {
										public void onClick(
												DialogInterface dialog, int id) {
											dialog.cancel();
										}
									});
					builder.create().show();

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

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

			rlName.setBackgroundResource(R.drawable.title_2);

			tvCardsName.setText(card.getTruename());

			tvCardsName.setTextColor(BULE);

			if (isCurrentItem) {
				tvCardName.setText(card.getTruename());
				tvCardsOtherInfo.setText(card.getMeno());
				tvCardsPhoneNumInfo.setText("电话:" + card.getMobile1());
				tvCardsMailInfo.setText("邮箱:" + card.getEmail());
				tvCardsAddressInfo.setText("地址:" + card.getAddress());

			}

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

	@Override
	protected void onStart() {
		super.onStart();
		init();
		// 给线性布局设置adapter

		MyApp.getInstance().addActivity(this);
	}

	@Override
	protected void onDestroy() {
		Common.DestroyLoading(CardsListAct.this);
		finish();
		super.onDestroy();
	}
}

知识点解析:

设置adapter要放在init中,当删除数据的时候调用init才不会出错,

如果只是放在oncreate中,删除数据再刷新的时候就会报错

// 设置adapter
		adapter = new FlexListAdapter();
		lv_cards.setAdapter(adapter);
		lv_cards.setOnItemClickListener(this);

这段代码就是控制只打开一个item,当打开其中一个item的时候其他的关闭

for (int i = 0; i < isCurrentItems.length; i++) {
			if (i != position) {
				isCurrentItems[i] = false;
			}

		}

判断打开还是关闭的优化代码:

 if (isCurrentItems[position]) {
            isCurrentItems[position] = false;
        } else {
            isCurrentItems[position] = true;
        }  

优化为

isCurrentItems[position] = !isCurrentItems[position];
时间: 2024-10-06 14:57:49

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

赵雅智_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; i

赵雅智: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" />