转载请标明出处:http://blog.csdn.net/zhaoyazhi2129/article/details/38080857

之前写了一篇静态数据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;}// 设置adapteradapter = new FlexListAdapter();lv_cards.setAdapter(adapter);lv_cards.setOnItemClickListener(this);}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}}@Overrideprotected void onStart() {super.onStart();init();// 给线性布局设置adapterMyApp.getInstance().addActivity(this);}@Overrideprotected void onDestroy() {Common.DestroyLoading(CardsListAct.this);finish();super.onDestroy();}}


知识点解析:

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

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

// 设置adapteradapter = 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];






更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android(安卓)ListView中子控件的状态保存以及点击子控件改变子
  5. Android使用JNI实现Java与C之间传递数据 .
  6. Android学习笔记----Intent
  7. Android之xUtils-3.0数据库框架详解
  8. Android(安卓)Parcelable和Serializable区别
  9. android 中application类的用法解释——共享全局数据

随机推荐

  1. linux下安装mysql数据库5.6源码安装,修改
  2. mysql备份脚本 mysqldump使用方法详解
  3. mysql 5.7.20 win64 安装及配置方法
  4. Mysql5.7解压版的安装和卸载及常见问题小
  5. 在Mac系统上配置MySQL以及Squel Pro
  6. Mysql数据库存储过程基本语法讲解
  7. Linux下MySQL数据库的主从同步复制配置
  8. mysql分表分库的应用场景和设计方式
  9. mysql数据库分表分库的策略
  10. Mysql语法、特殊符号及正则表达式的使用