android适配器item能隐藏,Android listview中item的点击显示或隐藏错乱的解决办法

在listview的adapter中做item点击监听事件时会出现显示错乱的问题,这个问题的解决办法也就是为点击的控件加一个tag,如下代码:

public class PriceMenuDetailAdapter extends BaseAdapter {

private ArrayList list_quotation;

private Context context;

private boolean[] showControl;//表明对应的item是否需要展开

public PriceMenuDetailAdapter(ArrayList list_quotation, Context context) {

this.list_quotation = list_quotation;

this.context = context;

showControl = new boolean[list_quotation.size()];//此时数组中的默认值都是false

}

@Override

public View getView(int i, View view, ViewGroup viewGroup) {

ViewHolder viewHolder = null;

if (view == null) {

view = LayoutInflater.from(context).inflate(R.layout.item_price_menu_detail, null);

viewHolder = new ViewHolder();

/*加载id*/

view.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) view.getTag();

}

AddQuotationBean.ASQuotations asQuotations = list_quotation.get(i);

viewHolder.tv_space_name.setText(asQuotations.SpaceName);

viewHolder.tv_diff_sum.setText("¥" + Util.getNonScientificCount(asQuotations.SpaceTotalMoney + "", true));

viewHolder.ll_info.removeAllViews();

ArrayList list_detail = asQuotations.QDetails;

for (int k = 0; k < list_detail.size(); k++) {

viewHolder.ll_info.addView(returnView(list_detail.get(k), k, list_detail.size()));

}

viewHolder.price_detail_layout.setTag(i);//为点击的区域设置Tag为position

if (showControl[i]) {//加载item的时候查看是否需要打开或隐藏

viewHolder.ll_info.setVisibility(View.GONE);

} else {

viewHolder.ll_info.setVisibility(View.VISIBLE);

}

viewHolder.price_detail_layout.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

int tag = (int) v.getTag();//获取点击位置对应的tag值

if (showControl[tag]) {//改变数组中对应的值

showControl[tag] = false;

} else {

showControl[tag] = true;

}

** notifyDataSetChanged();//重新加载**

}

});

return view;

}

private class ViewHolder{

private TextView tv_space_name;// 空间名

private TextView tv_diff_sum;// 差价小计

private LinearLayout ll_info;// 材料信息

private RelativeLayout price_detail_layout;//空间名和差价小计整体的布局

}

}

注意:我们平时对 ListView 做的最多的操作就是 setOnItemClickListener,这个操作一般都是在 Activity 中进行的,此时响应区域是 Item 整体,不管你点击 Item 的哪个角落都会响应。而对于每个 Item 中子控件的事件监听(区别于整个Item,比如说 Item 中的按钮、输入框等等)都是在适配器类中添加,此时只有点击添加监听的子控件区域才会响应,相当于每个 Item 中的该控件都添加了监听。OnClick 的响应优先级:子控件(元控件)> 父布局(但是不像 onTouch 事件有 Boolean 返回值那样,OnClick 事件是没有返回值的,即是“阻断式式响应”,不会再响应它所归属的上层控件)。

可以看到上面代码中加粗的" notifyDataSetChanged();//重新加载"这一句,这样写在adapter里面,如果是数据量大的情况下会造成listview滑动出现卡顿的现象,为了避免出现这种情况,可以修改代码如下:

/**@title PriceMenuDetailAdapter 填写报价单详情页面ListView的适配器

* @author Eric

* @date 2017/3/30

**/

public class PriceMenuDetailAdapter extends BaseAdapter {

private ArrayList list_quotation;

private Context context;

private boolean[] isShowContentClose;//表明对应的item是否需要展开,true为隐藏,false为打开

public PriceMenuDetailAdapter(ArrayList list_quotation, Context context) {

this.list_quotation = list_quotation;

this.context = context;

isShowContentClose = new boolean[list_quotation.size()];//此时数组中的默认值都是false

}

@Override

public View getView(int i, View view, ViewGroup viewGroup) {

ViewHolder viewHolder = null;

if (view == null) {

view = LayoutInflater.from(context).inflate(R.layout.item_price_menu_detail, null);

viewHolder = new ViewHolder();

/*加载id*/

view.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) view.getTag();

}

AddQuotationBean.ASQuotations asQuotations = list_quotation.get(i);

viewHolder.tv_space_name.setText(asQuotations.SpaceName);

viewHolder.tv_diff_sum.setText("¥" + Util.getNonScientificCount(asQuotations.SpaceTotalMoney + "", true));

viewHolder.ll_info.removeAllViews();

ArrayList list_detail = asQuotations.QDetails;

for (int k = 0; k < list_detail.size(); k++) {

viewHolder.ll_info.addView(returnView(list_detail.get(k), k, list_detail.size()));

}

viewHolder.price_detail_layout.setTag(i);//为点击的区域设置Tag为position

//相当于初始化控件的显示或隐藏

if (isShowContentClose[i]) {//加载item的时候查看是否需要打开或隐藏

viewHolder.ll_info.setVisibility(View.GONE);

} else {

viewHolder.ll_info.setVisibility(View.VISIBLE);

}

actionClick(viewHolder.price_detail_layout, viewHolder.ll_info);

return view;

}

//点击事件监听

private void actionClick(final RelativeLayout price_detail_layout, final LinearLayout ll_info) {

try {

price_detail_layout.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

int tag = (int) v.getTag();//获取点击位置对应的tag值

if (isShowContentClose[tag]) {//改变数组中对应的值

isShowContentClose[tag] = false;

} else {

isShowContentClose[tag] = true;

}

if (isShowContentClose[tag]) {//加载item的时候查看是否需要打开或隐藏

//手风琴效果,如果为true则隐藏如果为false则打开

ll_info.setVisibility(View.GONE);

} else {

ll_info.setVisibility(View.VISIBLE);

}

}

});

} catch (Exception e) {

LogUtil.e(getClass(), "actionClick()", e);

}

}

private class ViewHolder{

private TextView tv_space_name;// 空间名

private TextView tv_diff_sum;// 差价小计

private LinearLayout ll_info;// 材料信息

private RelativeLayout price_detail_layout;//空间名和差价小计整体的布局

}

}

总结:用一个集合加载position对应控件的tag状态,先初始化控件的隐藏或显示,在点击事件里面,改变对应集合的状态,然后改变控件的隐藏或显示.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值