关于BaseAdapter的数据混乱的分析与解决总结

之前使用BaseAdapter来绑定数据时,getView返回的布局每一项都不一样时很容易会出现混乱的情况:

比如说每个布局上我都显示一张图片(地址从网络获取的然后存到集合中),当你滑动之后,会发现图片错乱了,这一项显示的是另一项上的图片。或者你有一个点赞按钮,有着点赞数量,点赞之后,图标和数量都变了,但是当你滑动的时候又变了!这其实是因为你使用的始终是同一个数据集合,他每次滑动的时候去getView总会按照原来的去显示,因为它内部设计的会复用布局,所以解决办法就是,每当有这种随时有可能要改变状态的地方,就要在getView里面判断修改,正反两面都要重新设置:

比如,我写成if(flag){result = true},但是我并没有写else的内容,这样的话他复用的时候就不能回到初始值了,所以正反两方面都要设置!

第二个问题是,给布局或者里面的控件添加事件,需要用到getView里面的position时,不要在if(convertView==null){}里面设置,他那时设置的position是一开始convertView为null的情况下的position,但是,当你滑动的时候,他会复用已经建好的view(如果屏幕能一次显示3个Item,那么当第4个显示时会复用第1个Item的布局),也就是此时的布局是复用的,所以他的position还是当时新建布局时传入的position!这种情况只出现在使用了ViewHolder的时候!

解决方法是:

把添加事件的行为放在if(convertView){}else{}判断之后!

先前出错的代码:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
        convertView = View.inflate(getActivity(), R.layout.item_disclose_tab1, null);
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), DiscloseInfo.class);
                String momentId = (String) ((Map) mDatas.get(position)).get("momentId");
                intent.putExtra("momentId", momentId);
                startActivityForResult(intent, CALL_DETAIL_INFO_REQUEST_CODE);
                mClickedItem = position;
            }
        });
        viewHolder = new ViewHolder();
        viewHolder.mPortrait = (CustomShapeImageView) convertView.findViewById(R.id.portrait);
        viewHolder.mNickName = (TextView) convertView.findViewById(R.id.nickName);
        viewHolder.mTime = (TextView) convertView.findViewById(R.id.time);
        viewHolder.mContent = (TextView) convertView.findViewById(R.id.content);
        viewHolder.mAddress = (DrawableTextView) convertView.findViewById(R.id.address);
        viewHolder.mImageContainer = (LinearLayout) convertView.findViewById(R.id.imageContainer);
        viewHolder.mShareNum = (DrawableTextView) convertView.findViewById(R.id.shareNum);
        viewHolder.mCommentNum = (DrawableTextView) convertView.findViewById(R.id.commentNum);
        viewHolder.mPraiseIcon = (ImageView) convertView.findViewById(R.id.praiseIcon);
        viewHolder.mPraiseNum = (TextView) convertView.findViewById(R.id.praiseNum);

        viewHolder.mClickToShare = (LinearLayout) convertView.findViewById(R.id.clickToShare);
        viewHolder.mClickToShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击分享

            }
        });
        viewHolder.mClickToComment = (LinearLayout) convertView.findViewById(R.id.clickToComment);
        viewHolder.mClickToComment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击评论
                Intent intent = new Intent(getActivity(), DiscloseInfo.class);
                intent.putExtra("momentId", (String) ((Map) mDatas.get(position)).get("momentId"));
                startActivityForResult(intent, CALL_DETAIL_INFO_REQUEST_CODE);
                mClickedItem = position;
            }
        });
        viewHolder.mClickToPraise = (LinearLayout) convertView.findViewById(R.id.clickToPraise);
        viewHolder.mClickToPraise.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调接口的时候不能重复点
                v.setEnabled(false);
                //点击点赞
                //获取当前点击爆料的id
                String momentId = (String) ((Map) (mDatas.get(position))).get("momentId");
                //                        boolean nowState = mIfPraiseList.get(position);
                //点赞/取消点赞
                toCallWebModifyIfPraiseState(position, momentId, v, viewHolder.mPraiseIcon, viewHolder.mPraiseNum);
            }
        });
        convertView.setTag(viewHolder);
    } else
        viewHolder = (ViewHolder) convertView.getTag();
修改后正常的代码:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
        convertView = View.inflate(getActivity(), R.layout.item_disclose_tab1, null);
        viewHolder = new ViewHolder();
        viewHolder.mPortrait = (CustomShapeImageView) convertView.findViewById(R.id.portrait);
        viewHolder.mNickName = (TextView) convertView.findViewById(R.id.nickName);
        viewHolder.mTime = (TextView) convertView.findViewById(R.id.time);
        viewHolder.mContent = (TextView) convertView.findViewById(R.id.content);
        viewHolder.mAddress = (DrawableTextView) convertView.findViewById(R.id.address);
        viewHolder.mImageContainer = (LinearLayout) convertView.findViewById(R.id.imageContainer);
        viewHolder.mShareNum = (DrawableTextView) convertView.findViewById(R.id.shareNum);
        viewHolder.mCommentNum = (DrawableTextView) convertView.findViewById(R.id.commentNum);
        viewHolder.mPraiseIcon = (ImageView) convertView.findViewById(R.id.praiseIcon);
        viewHolder.mPraiseNum = (TextView) convertView.findViewById(R.id.praiseNum);

        viewHolder.mClickToShare = (LinearLayout) convertView.findViewById(R.id.clickToShare);
        viewHolder.mClickToShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击分享

            }
        });
        viewHolder.mClickToComment = (LinearLayout) convertView.findViewById(R.id.clickToComment);

        viewHolder.mClickToPraise = (LinearLayout) convertView.findViewById(R.id.clickToPraise);
        viewHolder.mClickToPraise.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调接口的时候不能重复点
                v.setEnabled(false);
                //点击点赞
                //获取当前点击爆料的id
                String momentId = (String) ((Map) (mDatas.get(position))).get("momentId");
                //                        boolean nowState = mIfPraiseList.get(position);
                //点赞/取消点赞
                toCallWebModifyIfPraiseState(position, momentId, v, viewHolder.mPraiseIcon, viewHolder.mPraiseNum);
            }
        });
        convertView.setTag(viewHolder);
    } else
        viewHolder = (ViewHolder) convertView.getTag();

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), DiscloseInfo.class);
            String momentId = (String) ((Map) mDatas.get(position)).get("momentId");
            intent.putExtra("momentId", momentId);
            startActivityForResult(intent, CALL_DETAIL_INFO_REQUEST_CODE);
            mClickedItem = position;
        }
    });
    viewHolder.mClickToComment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //点击评论
            Intent intent = new Intent(getActivity(), DiscloseInfo.class);
            intent.putExtra("momentId", (String) ((Map) mDatas.get(position)).get("momentId"));
            startActivityForResult(intent, CALL_DETAIL_INFO_REQUEST_CODE);
            mClickedItem = position;
        }
    });




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值