之前写了一篇静态数据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