2014-10-16 75 views
1

我的应用程序有一个列表视图和listview的行由imageView和Textview组成。该应用程序从网上下载图像以在行布局中设置imageview。当我在列表视图中上下滚动时,我遇到了有关图像重新下载的问题。为此,我使用ViewHolder模式保存列表项。问题已经解决,但这次我有一个新问题。当我滚动列表视图时,项目的位置正在改变

列表视图中有15行。因此,列表底部的项目不会显示。当我在列表中查看项目时,列表顶部的项目即将结束。另外,当我匆匆列出清单时,列表末尾的项目即将到来。

所以它不显示需要显示的值或行。

我getView()方法的最后状态..

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     ViewHolder viewHolder; 

      if (convertView == null) { 

       convertView = mInflater.inflate(R.layout.row_layout, null); 

       TextView programName = (TextView)convertView.findViewById(R.id.programName); 
       TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
       TextView programState = (TextView)convertView.findViewById(R.id.programState); 
       ImageView programImage = (ImageView)convertView.findViewById(R.id.programImage); 


       programName.setText(values.programNames.get(position)); 
       programTime.setText(values.programTimes.get(position)); 
       new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

       viewHolder = new ViewHolder(); 
       viewHolder.p_Name = programName; 
       viewHolder.p_Time = programTime; 
       viewHolder.p_State = programState; 
       viewHolder.p_Image = programImage; 

       convertView.setTag(viewHolder); 

      }else{ 

       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      return convertView; 
     } 

我的观点持有人...

public static class ViewHolder { 
    TextView p_Name; 
    TextView p_Time; 
    TextView p_State; 
    ImageView p_Image; 
} 

谢谢很多

回答

2

移动此之外,您可以设置的你的convertview

programName.setText(values.programNames.get(position)); 
programTime.setText(values.programTimes.get(position)); 
new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

因此,它看起来像这样

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    ViewHolder viewHolder; 

     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.row_layout, null); 

      TextView programName = (TextView)convertView.findViewById(R.id.programName); 
      TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
      TextView programState = (TextView)convertView.findViewById(R.id.programState); 
      ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 



      viewHolder = new ViewHolder(); 
      viewHolder.p_Name = programName; 
      viewHolder.p_Time = programTime; 
      viewHolder.p_State = programState; 
      viewHolder.p_Image = programImage; 

      convertView.setTag(viewHolder); 

     }else{ 

      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.p_Name.setText(values.programNames.get(position)); 
     viewHolder.p_Time.setText(values.programTimes.get(position)); 
     new imageDownload(programImage).execute(values.programImageUrls.get(position)); 


     return convertView; 
    } 

另外,我会强烈建议使用毕加索为您的图片下载,因为它会自动为您处理cacheing。我也会考虑用Butterknife注入你的ViewHolder,并且这也会减少你的代码在这里

+1

因为programName textview超出了if/else语句的范围,所以您需要将其附加到viewholder.p_name.setText()。 – MrPancake 2014-10-16 15:52:05

+0

你对某些(固定的) – 2014-10-16 16:42:16

-1

你应该在ViewHolder类上有一个位置值,这样你就可以比较从convertView.getTag()获取的ViewHolder的位置。 。如果convertView不为null,则需要确保在视图中具有正确的信息。

if (viewHolder.position != position) { 
    //retrieves the correct position of the information 
    viewHolder.p_Name.setText(values.programNames.get(position)); 

    //etc 
    viewHolder.position = position; 
} 
0

谢谢你的回答。我决定使用毕加索的图像。我只是改变了下面的代码

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

ViewHolder viewHolder; 

    if (convertView == null) { 

     convertView = mInflater.inflate(R.layout.row_layout, null); 

     TextView programName = (TextView)convertView.findViewById(R.id.programName); 
     TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
     TextView programState = (TextView)convertView.findViewById(R.id.programState); 
     ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 

     viewHolder = new ViewHolder(); 
     viewHolder.p_Name = programName; 
     viewHolder.p_Time = programTime; 
     viewHolder.p_State = programState; 
     viewHolder.p_Image = programImage; 

     convertView.setTag(viewHolder); 

    }else{ 

     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
      viewHolder.p_Ad.setText(values.programIsimleri.get(position)); 
      viewHolder.p_Saat.setText(values.programSaatleri.get(position)); 
    Picasso.with(getApplicationContext()).load(values.programImageUrls.get(position)).into(viewHolder.p_Image); 


    return convertView; 
} 

代码现在正常工作。

相关问题