2013-02-03 42 views
1

我正在处理一个基于ListView的应用程序,我有一个非常奇怪的问题,我的ListItems重新包装,正确的项目没有显示在正确的位置。为了便于理解,我将每个ListItem上的文本设置为与其位置相同。我在我的适配器getView()调用中执行此操作。如果我有Nexus 7 4 ListItems可见。如果我总共有10个ListItems,那么它将变为0,1,3,4,0,1,2,3,4。这适用于所有设备,假设最初在屏幕+1上的项目数量是正确的而所有其他ListItems被重新安装。Android ListView项目收纳

在我的代码的哪一部分,你们认为我的问题在于,因为现在我一直在努力解决这个问题几个小时,而且我很无能。非常感谢所有帮助。

编辑:

这里是我的getView():

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    CountdownItem ci = mTitle.get(position); 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, parent, false); 

     holder = new CountdownViewHolder(); 
     holder.mTitle = (TextView) convertView.findViewById(R.id.textPrim); 
     holder.mSubtitle = (TextView) convertView 
       .findViewById(R.id.textSec); 
     holder.mDayProgress = (ProgressBar) convertView 
       .findViewById(R.id.day_progress); 
     holder.mMonthProgress = (ProgressBar) convertView 
       .findViewById(R.id.month_progress); 
     holder.mYearText = (TextView) convertView 
       .findViewById(R.id.year_text); 
     holder.day_help = (TextView) convertView 
       .findViewById(R.id.day_help); 
     holder.month_help = (TextView) convertView 
       .findViewById(R.id.month_help); 

     holder.setTitle(Integer.toString(position) + " Title"); 
     holder.setSubtitle(ci.getSubtitle()); 
     holder.fixImageAndText(position); 

     convertView.setTag(holder); 
    } else { 
     holder = (CountdownViewHolder) convertView.getTag(); 
    } 

    return convertView; 
} 
+1

发布你的'getView()'方法的代码。 ListAdapter可以回收视图,也许你没有正确考虑这一点。 –

+0

@DavidWasser我的getView()已被添加。 – SweSnow

回答

1

您没有正确使用ViewHolder模式。下面的代码需要if/else条款外return convertView之前移动:

holder.setTitle(Integer.toString(position) + " Title"); 
    holder.setSubtitle(ci.getSubtitle()); 
    holder.fixImageAndText(position); 
+0

非常感谢!我非常感谢!一直在这工作几个小时,我不能相信我错过了。你先生,是我的英雄。 – SweSnow

+0

谢谢!很高兴能帮上忙。

1

是的,这是因为Android的重用在列表视图,来增加性能和渲染速度。

持有者模式用于存储视图id。检索完毕后,您必须设置要在里面看到的文字。

例如,您检索数据(例如myDataArray[position]),如果一切正常,则继续使用TextView的setText()设置标题,副标题,日历进度等。

1

这是当它被重用细胞ListView的正确的行为,问题是,你只在小区先设定值创建。

当convertView == null时,listview没有可回收的单元。但是,一旦它创建了一些,它就可以在您滚动时重用它们来显示。

即使convertView不为null,您需要设置标题和副标题。这样你就可以为每个新的列表位置设置它们。