关于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
- 关于BaseAdapter的数据混乱的分析与解决总结
- 数据适配器BaseAdapter的使用与优化
- BaseAdapter(数据适配器)的使用与优化
- 关于BaseAdapter和GridView与后台Service服务进程交换数据的小小的经验总结
- 关于BaseAdapter的使用
- 关于BaseAdapter的使用
- 关于BaseAdapter的用法
- 静态的数据 baseadapter
- JavaScript 特有奇葩问题“字符串类型与数字类型混乱”的分析与解决,与类型转换
- 解决BaseAdapter的ArrayIndexOutOfBoundsException异常
- BaseAdapter 解决卡的问题
- C与C++易混乱的点 总结
- 关于BaseAdapter,SimpleAdapter的数据显示错乱问题,选中状态错乱问题,Checkbox选中状态错乱问题总结
- BaseAdapter 刷新数据的方法
- BaseAdapter与SimpleAdapter的使用
- ListView与BaseAdapter的优化
- BaseAdapter的使用与优化
- BaseAdapter的使用与优化
- Eclipse中设置选中某个字段页面中同名的标记出来
- Linux平台下java程序员的基本功(七)
- Linux目录结构、Linux分区大小、挂载点和如何分区
- Aapche POI txt 导入excel
- Android项目快速编译之Freeline-Android的配置与集成
- 关于BaseAdapter的数据混乱的分析与解决总结
- Android 实现图片的单点缩放、拖动、旋转
- Linux平台下java程序员的基本功(六)
- Ubuntu 12.04中设置安装Google拼音输入法
- ubuntu14.04安装visp3.0.0
- weex实践初探
- 前端问题笔记-1
- iOS超全开源框架、项目和学习资料汇总(3)网络和Model篇
- UITableView中刷新Cell