之前使用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; } });