Android开发经验分享-GridView、ListView内容错乱
来源:互联网 发布:洛阳驱逐舰数据 编辑:程序博客网 时间:2024/06/03 16:39
在使用GridView、ListView的过程中遇到内容错乱的问题,费了较长时间才找到问题的根源,特地总结一下。
1、在自定义adapter中没有给每一项都设置内容导致内容错乱:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {if( null == convertView ){mGridHolder = new GridHolder( ); convertView = mLayoutInflater.inflate( R.layout.view_log_word_item_layout, null ); mGridHolder.mBackTopLayout = (LinearLayout)convertView.findViewById( R.id.logItemTopLayoutId); mGridHolder.mBackBottomLayout = ( RelativeLayout )convertView.findViewById( R.id.logItemBottomLayoutId ); mGridHolder.mRightWordTxt = ( TextView )convertView.findViewById( R.id.rightWordTxtId ); mGridHolder.mUserWriteImg = ( ImageView )convertView.findViewById( R.id.userWordImgId ); mGridHolder.mWriteResultImg = ( ImageView )convertView.findViewById( R.id.writeResultImgId ); mGridHolder.mReasonTxt = ( TextView )convertView.findViewById( R.id.reasonTxtId ); mGridHolder.mRightWordTxt.setTypeface( mTypeface ); convertView.setTag( mGridHolder ); }else{ mGridHolder = ( GridHolder )convertView.getTag( ); } showContent( mDictationInfoList.get( position ) ); return convertView;}@SuppressWarnings("deprecation")private void showContent( DictationInfo dictationInfo ){ mGridHolder.mRightWordTxt.setText( dictationInfo.getmWord( ) ); if( null != dictationInfo.getmDrawable( ) ){ mGridHolder.mUserWriteImg.setBackgroundDrawable( dictationInfo.getmDrawable( ) ); if( !TextUtils.isEmpty( dictationInfo.getDetailReason( ) ) ){ mGridHolder.mReasonTxt.setText( dictationInfo.getDetailReason( ) ); }else{ mGridHolder.mReasonTxt.setText( "" ); } setWriteResult( dictationInfo.getmWriteResult( ) ); }else{ // 没有为内容项为空的项设置内容 }}
上面是一个自定义adapter中的一段代码,在getView中为每一项设置内容时只处理了有内容的项,没有内容的项没有赋值,导致在滑动内容时内容错乱,分析发现这是由于使用了adapter的缓存机制导致的,正确的处理方式是需要为内容为空的项也要赋值,修改后的代码如下:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {if( null == convertView ){mGridHolder = new GridHolder( ); convertView = mLayoutInflater.inflate( R.layout.view_log_word_item_layout, null ); mGridHolder.mBackTopLayout = (LinearLayout)convertView.findViewById( R.id.logItemTopLayoutId); mGridHolder.mBackBottomLayout = ( RelativeLayout )convertView.findViewById( R.id.logItemBottomLayoutId ); mGridHolder.mRightWordTxt = ( TextView )convertView.findViewById( R.id.rightWordTxtId ); mGridHolder.mUserWriteImg = ( ImageView )convertView.findViewById( R.id.userWordImgId ); mGridHolder.mWriteResultImg = ( ImageView )convertView.findViewById( R.id.writeResultImgId ); mGridHolder.mReasonTxt = ( TextView )convertView.findViewById( R.id.reasonTxtId ); mGridHolder.mRightWordTxt.setTypeface( mTypeface ); convertView.setTag( mGridHolder ); }else{ mGridHolder = ( GridHolder )convertView.getTag( ); } showContent( mDictationInfoList.get( position ) ); return convertView;}@SuppressWarnings("deprecation")private void showContent( DictationInfo dictationInfo ){ mGridHolder.mRightWordTxt.setText( dictationInfo.getmWord( ) ); if( null != dictationInfo.getmDrawable( ) ){ mGridHolder.mUserWriteImg.setBackgroundDrawable( dictationInfo.getmDrawable( ) ); if( !TextUtils.isEmpty( dictationInfo.getDetailReason( ) ) ){ mGridHolder.mReasonTxt.setText( dictationInfo.getDetailReason( ) ); }else{ mGridHolder.mReasonTxt.setText( "" ); } setWriteResult( dictationInfo.getmWriteResult( ) ); }else{ mGridHolder.mUserWriteImg.setBackgroundResource( Color.TRANSPARENT ); mGridHolder.mReasonTxt.setText( "" ); mGridHolder.mWriteResultImg.setBackgroundResource( R.drawable.log_unknown ); mGridHolder.mBackTopLayout.setBackgroundResource( R.drawable.log_item_wrong_top_background ); mGridHolder.mBackBottomLayout.setBackgroundResource( R.drawable.log_item_wrong_bottom_background ); }}
2、在自定义adapter的getview方法中,每一项的内容加载时间过长导致内容错乱。
@Overridepublic View getView(int position, View convertView, ViewGroup parent) { mViewHolder = new ViewHolder( ); convertView = mLayoutInflater.inflate( R.layout.adapter_score_list_layout, null ); mViewHolder.mScoreLayout = ( RelativeLayout )convertView.findViewById( R.id.scoreLayoutId ); mViewHolder.mScoreLayout.setClickable( false ); mViewHolder.mPositionTxt = ( TextView )convertView.findViewById( R.id.positionTxtId ); mViewHolder.mUserNameTxt = ( TextView )convertView.findViewById( R.id.userNameTxtId ); mViewHolder.mUserNameTxt.setTypeface( mTypeface ); mViewHolder.mUserIconImg = ( ImageView )convertView.findViewById( R.id.userIconImgId ); mViewHolder.mUserScoreTxt = ( TextView )convertView.findViewById( R.id.userScoreTxtId ); showContent( position, mUserInfoList.get( position ) ); return convertView;}private void showContent( int index, UserScoreInfo userInfo ){ // 从网络获取头像 handleUserIcon( mImageLoader, userInfo, mUserId ); mViewHolder.mPositionTxt.setVisibility(TextView.VISIBLE); mViewHolder.mPositionTxt.setText( "第" + userInfo.getScoreRank( ) + "名" ); if( mUserId.equals( userInfo.getUserId( ) ) ){ mMyPosition = index; mViewHolder.mScoreLayout.setBackgroundResource( R.drawable.chinese_dictation_score_list_select ); }else{ mViewHolder.mScoreLayout.setBackgroundResource( R.drawable.chinese_dictation_score_list_normal ); } String userName = userInfo.getNickName( ); if( !TextUtils.isEmpty( userName ) ){ userName = ( userName.length( ) > 10 )?( userName.substring(0, 7) + "..." ):userName; }else{ userName = "佚名"; } if( mUserId.equals( userInfo.getUserId( ) ) ){ String localUserName = PersonalInfo.getCurrentUserName( mContext ); mMyPosition = index; mViewHolder.mScoreLayout.setBackgroundResource( R.drawable.chinese_dictation_score_list_select ); if( TextUtils.isEmpty( userName ) || ( !localUserName.equals( userName ) ) ){ mViewHolder.mUserNameTxt.setText( localUserName ); }else{ mViewHolder.mUserNameTxt.setText( userName ); } }else{ mViewHolder.mScoreLayout.setBackgroundResource( R.drawable.chinese_dictation_score_list_normal ); mViewHolder.mUserNameTxt.setText( userName ); } mViewHolder.mUserScoreTxt.setText( StringUtils.getSplitByComma( userInfo.getScore( ) + "" ) );}上面是一个获取用户排名列表所自定义adapter中的一段代码,handleUserIcon方法是从网络获取用户头像,在滑动排名列表的时候发现用户头像会错乱,最后跟踪找到具体的原因是由于从网络获取用户头像耗时,正确的做法应该是在获取完成用户头像之后再通知adapter更新。
在使用gridview和listview的过程中,由于需要加载大量的内容,android建议我们采用viewholder的缓存机制,这样能够提高列表加载的效率,但是在使用的过程中一定要注意上面这两个问题,否则可能会让你很头疼。
0 0
- Android开发经验分享-GridView、ListView内容错乱
- Android开发经验分享-GridView、ListView内容错乱
- ListView,GridView等内容显示错位错乱问题
- Android ListView/GridView的item中 CheckBox状态错乱
- Android ListView解决滑动后内容错乱为题!
- android listview错乱问题
- Android gridview、listview控件内容刷新问题
- Android 开发建立经验分享...
- Android Notification 开发经验分享
- android ListView使用ViewHolder优化时,EditText设置TextWatcher时,滑动ListView导致内容错乱
- Android ListView CheckBox状态错乱
- Android ListView Button 顺序错乱
- Android ListView CheckBox状态错乱
- Android ListView CheckBox状态错乱
- Android ListView CheckBox状态错乱
- Android ListView CheckBox状态错乱
- Android ListView数据错乱问题解决
- Android ListView CheckBox状态错乱
- frameset规范连接跳出框架原因分析
- 小心Python的“坑”(持续更新)
- 一次团队梳理工作的备忘
- Fragment切换动画
- 最佳线程数
- Android开发经验分享-GridView、ListView内容错乱
- c++实现的最小堆类
- android 调用系统照相机和图库的方法
- Seven habits of effective text editing
- jMobile。。。
- 第二章 线性表
- storyboard中使用segue给navigationBar设置标题
- C/C++基础笔试题1.1.2(运算符十问之解)
- 使用plist创建精灵并执行动画