背景:最近有个需求是要实现ListView点击展开,再次点击收起这样一个效果,同时,任何一个时刻都只允许一个ListView展开,展开后,里面的button等能够获得焦点并能响应其他事件的处理。
实现过程:首选网上的第三方jar:expendsListView,demo实现没有问题,放到项目中挂掉!放弃!
系统自带的ExpandableListView,发现这个做出来的效果和实际要实现的效果有差距,放弃!
因为原理也简单,就是在点击item后更新adapter并让隐藏的view可见,使用gone,自己写了个demo,下面上效果图,不会动滴~~!
主要的原理就是给头部布局设置点击事件,点击之后显示,之后又隐藏,具体getView的代码贴在下面
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
FlightInfo flightInfo = infos.get(position);
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(MainActivity.this,
R.layout.cabin_more_item, null);
holder.cabin = (TextView) convertView
.findViewById(R.id.tv_cabin);
holder.discount = (TextView) convertView
.findViewById(R.id.zhekou);
holder.price = (TextView) convertView
.findViewById(R.id.tv_price);
holder.setNum = (TextView) convertView
.findViewById(R.id.tv_seatnum);
holder.rl_title = (RelativeLayout) convertView
.findViewById(R.id.rl_title);
holder.ll_footer = (LinearLayout) convertView
.findViewById(R.id.ll_footer);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (currentItem == position) {
holder.ll_footer.setVisibility(View.VISIBLE);
} else {
holder.ll_footer.setVisibility(View.GONE);
}
holder.rl_title.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int tag = (Integer) v.getTag();
if (tag == currentItem) {
currentItem = -1;
} else {
currentItem = tag;
}
adapter.notifyDataSetChanged();
}
});
holder.cabin.setText(flightInfo.getCabin());
holder.discount.setText(flightInfo.getDiscount());
holder.price.setText(flightInfo.getPrice());
holder.setNum.setText(flightInfo.getSeatNum());
holder.rl_title.setTag(position);
return convertView;
}
最终实现了功能!!不过这个是调用adapter.notifyDataSetChanged();来实现的,如果条目过多效率也会有问题,写过一个用handler来更新position对应的布局的,那个demo回头找找上传!
代码不会传!下午看看再传上来。