对于ListView中TextView的数据显示问题

         今天在做一个关于ListView的页面展示时候,遇到一个关于TextView展示问题,赶紧记下来,因为Listview包括一些TextView,并且这部分TextView并不是全部都有数据的,当没有数据的时候,需要将对应的ListView隐藏掉。那么,问题来了,为什么会出现某些TextView明明有数据,却不会显示出来呢
           首先先上我这边的错误代码:
        public View getView(final int position, View convertView, ViewGroup parent) {
            Holder holder = null;
            if (convertView==null){
                holder = new Holder();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.videolist_row,null);
                holder.mSingerLogoIv = (CircleImageView) convertView.findViewById(R.id.singerlogo_iv);
                holder.mSourceNameTv = (TextView) convertView.findViewById(R.id.sourcename_tv);
                holder.mText1 = (TextView) convertView.findViewById(R.id.text1);
                holder.mText2 = (TextView) convertView.findViewById(R.id.text2);
                holder.mText3 = (TextView) convertView.findViewById(R.id.text3);
                holder.mLayoutComment = (LinearLayout) convertView.findViewById(R.id.layoutcomment);
                convertView.setTag(holder);
            }else{
               holder = (Holder)convertView.getTag();
            }
               if (!checkIns.text1.equals("")) {
                    mViewHolder.mText1.setText(checkIns.text1);
                } else{                  
                 mViewHolder.mText1.setVisibility(View.GONE);
               }
              if (!checkIns.text2.equals("")) {
                    mViewHolder.mText2.setText(checkIns.text2);
                } else{                  
                 mViewHolder.mText2.setVisibility(View.GONE);
               }
               if (!checkIns.text3.equals("")) {
                    mViewHolder.mText3.setText(checkIns.text3);
                } else{                  
                 mViewHolder.mText3.setVisibility(View.GONE);
               }
          这里的Text1,Text2,Text3为测试TextView。
相信对于ListView有点心得的同学都知道,我们在关于ListView开发的时候,为了提高效率,提高ListView中对于View的复用性,我们通常都会用到Holder。当convertView不为空的时候,我们才会给Holder初始化。并且将Holder set到convertView中,然后当ListView再次执行getView()方法时候,就会查看convertView是否为空,并且从convertView中getTag出来已经存在的Holder。上述代码出现的情况是当我在第一个Item里面1个TextView都是显示的。然后我在下滑,最上面的Item被隐藏掉之后,新的Item就会重新复用第一条的Holder。

          关键问题来了,在新的Item里面我的3个TextView都是要显示的,但是却只有Text1显示出来了,而Text2和Text3却没有显示,这是为什么呢?
我们来一起探究一下我们复用的这个Holder。  用Debug模式来跟随一下TextView的状态就可以发现,Text1.setVisibility的值是8和Text2,Text3的是0。查询api可以发现,8是表示当前的这个Text1是可见的,即VISIBILITY。0表示当前这个Text是不可见的,也就是GONE。

        so,问题发现了,我们在复用Holder时候,需要人为的更改当前控件的状态。这样,就不会出现控件莫名消失的情况啦!
更正代码如下:
 public View getView(final int position, View convertView, ViewGroup parent) {
            Holder holder = null;
            if (convertView==null){
                holder = new Holder();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.videolist_row,null);
                holder.mSingerLogoIv = (CircleImageView) convertView.findViewById(R.id.singerlogo_iv);
                holder.mSourceNameTv = (TextView) convertView.findViewById(R.id.sourcename_tv);
                holder.mText1 = (TextView) convertView.findViewById(R.id.text1);
                holder.mText2 = (TextView) convertView.findViewById(R.id.text2);
                holder.mText3 = (TextView) convertView.findViewById(R.id.text3);
                holder.mLayoutComment = (LinearLayout) convertView.findViewById(R.id.layoutcomment);
                convertView.setTag(holder);
            }else{
               holder = (Holder)convertView.getTag();
            }
               if (!checkIns.text1.equals("")) {
                    mViewHolder.mText1.setText(checkIns.text1);
                    mViewHolder.mText1.setVisibility(View.GONE);
                } else{                  
                 mViewHolder.mText1.setVisibility(View.GONE);
               }
              if (!checkIns.text2.equals("")) {
                    mViewHolder.mText2.setText(checkIns.text2);
                    mViewHolder.mText1.setVisibility(View.
VISIBILITY
);                } else{                  
                 mViewHolder.mText2.setVisibility(View.GONE);
               }
               if (!checkIns.text3.equals("")) {
                    mViewHolder.mText3.setText(checkIns.text3);
                    mViewHolder.mText1.setVisibility(View.VISIBILITY);
                } else{                  
                 mViewHolder.mText3.setVisibility(View.GONE);
               }
好啦,这样就不会出现在重绘View时候,出现View错位,消失的情况啦。

猜你喜欢

转载自blog.csdn.net/ibelieveyouwxy/article/details/41247625
今日推荐