Android 滚动listview时,listview中项目的位置正在更改
我的应用程序有一个listview,listview的行由imageView和Textview组成。应用程序从web下载图像以在行布局中设置imageview。在上下查看listview时,我遇到了图像重新下载的问题。出于这个原因,我使用了ViewHolder模式来保存列表项。问题已经解决了,但这次我遇到了一个新问题 Listview中有15行。因此,列表底部的项目不会出现。当我向下滚动列表查看项目时,列表顶部的项目将进入lisview的末尾。另外,当我翻阅列表时,列表末尾的项目会排在列表的顶部 因此,它不会显示需要显示的值或行 我的getView()方法的最后一个状态是Android 滚动listview时,listview中项目的位置正在更改,android,listview,android-listview,recycle,getview,Android,Listview,Android Listview,Recycle,Getview,我的应用程序有一个listview,listview的行由imageView和Textview组成。应用程序从web下载图像以在行布局中设置imageview。在上下查看listview时,我遇到了图像重新下载的问题。出于这个原因,我使用了ViewHolder模式来保存列表项。问题已经解决了,但这次我遇到了一个新问题 Listview中有15行。因此,列表底部的项目不会出现。当我向下滚动列表查看项目时,列表顶部的项目将进入lisview的末尾。另外,当我翻阅列表时,列表末尾的项目会排在列表的顶部
@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;
}
非常感谢请将此移到设置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;
}
另外,我强烈建议您使用毕加索进行图像下载,因为它可以为您自动处理缓存。我还将考虑使用Butterknife注入ViewHolder,这将减少这里的代码在ViewHolder类上应该有一个position值,以便可以比较从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;
}
谢谢你的回答。我决定用毕加索的画作。我只是简单地修改了下面的代码
@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;
}
代码现在工作正常。您需要将其附加到viewholder.p_name.setText()上,因为程序名textview超出了if/else语句的范围。