Android中ListView复用导致其他Item显示异常

基于上一个博客内容在在有大量Item的情况下,
Android会对ListView中的Item进行复用,
就会导致触发上面一个Item中的按钮后导致下面的按钮也跟着变

红色边框代表手机屏幕
Item1、Item2、Item3是在屏幕上显示
Item4、Item5需要滑动才可见
这里写图片描述
点击Item1后滑动屏幕后发现Item4也被触发了
不想出现这种情况需要对被点击的项进行一些处理

//定义一个列表用于保存选中项目
CustomSimpleAdapter adapter_your = new CustomSimpleAdapter(RecommendActivity.this, getData(), R.layout.list_recommendyour_item,
                new String[]{"MyID", "MusicName"},
                new int[]{R.id.txt_myID, R.id.txt_music_title, R.id.txt_singer);

自定义一个Adapter

/*
    * 自定义Adapter、继承SimpleAdapter
    * 用于解决按钮被复用的问题
     */
    private class CustomSimpleAdapter extends SimpleAdapter {
        //定义一个列表用于保存选中项目
        private List<Integer> mSelect = new ArrayList<Integer>();

        public CustomSimpleAdapter(Context context,
                                   List<? extends Map<String, ?>> data, int resource,
                                   String[] from, int[] to) {
            super(context, data, resource, from, to);
            // TODO Auto-generated constructor stub
        }
        //重点是这里,需要重写getView
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            final int mPosition = position;
            //获取当前的View
            convertView = super.getView(position, convertView, parent);
            //取出按钮或是CheckBox
            ImageButton btn_more = (ImageButton) convertView.findViewById(R.id.btn_more);
            btn_more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //此处记录下当前操作的mPosition
                    mSelect.add(new Integer(mPosition));
                    //下面是你对应的页面效果处理,比如显示、隐藏
                    int visiblePosition = list_your.getFirstVisiblePosition();
                    View currentView = list_your.getChildAt(mPosition - visiblePosition); 
                    currentView.findViewById(R.id.control2).setVisibility(View.VISIBLE);
                    currentView.findViewById(R.id.control1).setVisibility(View.GONE);
                }
            });


            ImageButton btn_back = (ImageButton) convertView
                    .findViewById(R.id.btn_back);
            btn_back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //此处删除当前操作的mPosition
                    mSelect.remove(new Integer(mPosition));
                    //下面是你对应的页面效果处理,比如显示、隐藏
                    int visiblePosition = list_your.getFirstVisiblePosition();
                    View currentView = list_your.getChildAt(mPosition - visiblePosition);                    
                    currentView.findViewById(R.id.control1).setVisibility(View.VISIBLE);
                    currentView.findViewById(R.id.control2).setVisibility(View.GONE);
                }
            });

            //在结尾的时候重记录的列表中对页面效果进行处理
            if (mSelect.indexOf(mPosition) > -1) {
                convertView.findViewById(R.id.control2).setVisibility(View.VISIBLE);
                convertView.findViewById(R.id.control1).setVisibility(View.GONE);
            }else{
                convertView.findViewById(R.id.control1).setVisibility(View.VISIBLE);
                convertView.findViewById(R.id.control2).setVisibility(View.GONE);
            }

            return convertView;
        }
    }

数据绑定可以参考上一篇文章
Android中ListView数据绑定和获取内部控件
http://blog.csdn.net/q12076235/article/details/48264277

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值