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

来源:互联网 发布:学习软件测试的视频 编辑:程序博客网 时间:2024/06/09 15:18

之前使用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{}判断之后!

先前出错的代码:

@Overridepublic 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();
修改后正常的代码:

@Overridepublic 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;        }    });




0 0
原创粉丝点击