ListView中有控件隐藏或显示造成的显示异常有关问题

ListView中有控件隐藏或显示造成的显示错误问题

 

ListView中有控件隐藏或显示造成的显示错误问题

 

直接上代码

@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		/**
		 * 进行ListView 的优化
		 */
		if (convertView == null) {
			convertView = (ViewGroup) LayoutInflater.from(context).inflate(
					R.layout.abc_fragment_nearby_listview, parent, false);
			holder = new ViewHolder();
			holder.iv_type=(ImageView) convertView.findViewById(R.id.abc_fragment_nearby__listview__iv_type);
			holder.iv_faceimg=(ImageView) convertView.findViewById(R.id.abc_fragment_nearby__listview__iv_faceimg);
			holder.tv_name=(TextView) convertView.findViewById(R.id.abc_fragment_nearby_listview__tv_name);
			holder.iv_player_team_faceimg= (ImageView) convertView.findViewById(R.id.abc_fragment_nearby__listview__iv_player_team_faceimg);
			holder.tv_player_team_name= (TextView) convertView.findViewById(R.id.abc_fragment_nearby__listview__iv_player_team_name);
			convertView.setTag(holder);
			Log.d("TagListView", "新创建ViewHolder");
		} else {
			holder = (ViewHolder)convertView.getTag();
			Log.d("TagListView", "缓存中获取ViewHolder");
		}
		
		//restore view state
		holder.tv_player_team_name.setVisibility(View.VISIBLE);
		holder.iv_player_team_faceimg.setVisibility(View.VISIBLE);

		//get data
		final BeanNearby bean = datas.get(position);
		
		//数据类型
		int type=bean.getType();
		ImageView iv_type= holder.iv_type;
		int[] types = new int[]{R.drawable.abc_fragment_nearby__listview__iv_type0,R.drawable.abc_fragment_nearby__listview__iv_type1,R.drawable.abc_fragment_nearby__listview__iv_type2};
		iv_type.setImageResource(types[type]);
		
		//设置图片
		String faceimg = bean.getFaceimg();
		ImageView iv_faceimg= holder.iv_faceimg;
		logi("faceimg="+faceimg);
		
		//显示图片
		new DownAndShowImageTask(faceimg,iv_faceimg).execute();
		
		//设置名称
		String name = bean.getName();
		TextView tv_name = holder.tv_name;
		tv_name.setText(name);
		
		//如果是球员
		ImageView iv_player_team_faceimg = holder.iv_player_team_faceimg;
		TextView tv_player_team_name =holder.tv_player_team_name;
		String playerTeamName = bean.getPlayerTeamName();
		String playerTeamFaceimg = bean.getPlayerTeamFaceimg();
		if(type==BeanNearby.TYPE_PERSON){
			if(playerTeamName==null){
				playerTeamName="";
			}
			tv_player_team_name.setText(playerTeamName);
			
			if(playerTeamFaceimg!=null&&playerTeamFaceimg.length()>0){
				new DownAndShowImageTask(playerTeamFaceimg,iv_player_team_faceimg).execute();
			}else{
				iv_player_team_faceimg.setVisibility(View.INVISIBLE);
			}
		}else{
			tv_player_team_name.setVisibility(View.GONE);
			iv_player_team_faceimg.setVisibility(View.GONE);
		}

		return convertView;
	}

 

 其中的

//restore view state
holder.tv_player_team_name.setVisibility(View.VISIBLE);
holder.iv_player_team_faceimg.setVisibility(View.VISIBLE);

 这段代码必须要有,对布局进行还原。这是因为在下面的代码中会对控件进行隐藏(View.INVISIBLE)或彻底不显示(View.GONE)。

如果不加这段代码,这个ListView上下滚动时候你会发现数据会发生混乱和错误。