1

我正在开发一个基于 ListView 的应用程序,但我遇到了一个非常奇怪的问题,我的 ListItems 正在重新出现,并且正确的项目没有显示在正确的位置。为了便于理解,我将每个 ListItem 上的文本设置为与其位置相同。我在我的适配器 getView() 调用中这样做。如果我有我的 Nexus 7 4 ListItems 是可见的。如果我总共有 10 个 ListItem,那么它将像 0、1、3、4、0、1、2、3、4 一样。这适用于所有设备,这意味着屏幕上最初的项目数 + 1 将是正确的而所有其他 ListItems 都重新排列。

你们认为我的问题出在我的代码的哪一部分,因为现在我已经尝试解决这个问题几个小时了,我一无所知。非常感谢所有帮助。

编辑:

这是我的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;
}
4

3 回答 3

1

是的,这是因为 android 重用列表中的视图,以提高性能和渲染速度。

持有者模式用于存储视图 ID。检索它们后,您必须设置要在其中看到的文本。

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

于 2013-02-03T15:05:04.113 回答
1

您没有正确使用 ViewHolder 模式。以下代码需要移到if/else子句之外和之前return convertView

   holder.setTitle(Integer.toString(position) + " Title");
   holder.setSubtitle(ci.getSubtitle());
   holder.fixImageAndText(position);
于 2013-02-03T15:08:26.703 回答
1

这是列表视图在重用单元格时的正确行为,问题是您仅在首次创建单元格时设置值。

当 convertView == null 时,列表视图没有要回收的单元格。但是,一旦它创建了一些,它就可以在滚动时重复使用它们来显示。

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

于 2013-02-03T15:11:07.923 回答