赵雅智_名片夹(5)_Android中listview可折叠伸缩仿手风琴效果(动态)
16lz
2021-01-25
转载请标明出处: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];
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)ListView中子控件的状态保存以及点击子控件改变子
- Android使用JNI实现Java与C之间传递数据 .
- Android学习笔记----Intent
- Android之xUtils-3.0数据库框架详解
- Android(安卓)Parcelable和Serializable区别
- android 中application类的用法解释——共享全局数据