我在android中自定义创建的CursorAdapter派生类遇到一个奇怪的问题:

我的getView()实现是直接在许多网站/ Google讲座上看到的教科书。但是,似乎对于不同的位置(使用此方法调用的位置参数),此方法正在传递相同的convertView实例,即使如我所见,它们应引用不同的对象实例,因为它应对应于ListView中的其他可见项,并且在可见列表项的情况下不应重复使用同一对象实例。

我删除了更新实际视图的实际部分,因为即使没有问题,问题也会重现。

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

        Log.d("dd", "getView()");

        if (convertView == null) {
            Log.d("d", "convertview is null!");

            // create convertView from xml
            convertView = this.mInflater.inflate(R.layout.catalog_entry,
                    parent, false);

            // create the viewHolder
            viewHolder = new ViewHolder();

            viewHolder.name = (TextView) convertView
             .findViewById(R.id.gameName2);
             viewHolder.image = (ImageView) convertView
             .findViewById(R.id.gameImage);

            convertView.setTag(viewHolder);
        } else {
            Log.d("dd", "convertview is not null");
            viewHolder = (ViewHolder) convertView.getTag();
        }

        LinearLayout thisItem = (LinearLayout) convertView;
        Log.d("thisItem",
                "This Item is Index "
                        + position
                        + " "
                        + thisItem.toString()
                        + " "
                        + Integer.toHexString(System.identityHashCode(thisItem))
                        + "x: " + thisItem.getX() + " y: " + thisItem.getY());

        this.cur.moveToPosition((int) (getItemId(position) - 1));

        Log.d("dd", "End of getView()");
        return convertView;
    }


运行以下代码将产生以下输出:


  D / dd(27725):getView()D / d(27725):convertview为空!
  D / thisItem(27725):此项是索引0
  android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / dd
  (27725):convertview不为空D / thisItem(27725):此项为索引
  1 android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / dd
  (27725):convertview不为空D / thisItem(27725):此项为索引
  2 android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / dd
  (27725):convertview不为空D / thisItem(27725):此项为索引
  3 android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / dd
  (27725):convertview不为空D / thisItem(27725):此项为索引
  4 android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / dd
  (27725):convertview不为空D / thisItem(27725):此项为索引
  0 android.widget.LinearLayout@40fb5f70 40fb5f70x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / d
  (27725):convertview为空! D / thisItem(27725):此项是索引1
  android.widget.LinearLayout@40fb89f8 40fb89f8x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / d
  (27725):convertview为空! D / thisItem(27725):此项是索引2
  android.widget.LinearLayout@40fb9c48 40fb9c48x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / d
  (27725):convertview为空! D / thisItem(27725):此项是索引3
  android.widget.LinearLayout@40fbae98 40fbae98x:0.0 y:0.0 D / dd
  (27725):getView()D / dd结束(27725):getView()D / d
  (27725):convertview为空! D / thisItem(27725):此项是索引4
  android.widget.LinearLayout@40fbc0e8 40fbc0e8x:0.0 y:0.0 D / dd
  (27725):getView()的结尾


从一开始就可以看出,对于每个位置(0到4),都将发送相同的View对象哈希。

最佳答案

简而言之,将ListView的高度设置为match_parent或其他固定高度。

有许多原因导致ListView以“空运行”方式调用getView(),最常见的原因是因为您已经将wrap_content用作ListView的高度。 Android必须对一堆行进行充气以计算wrap_content的高度,但由于尚不可用,因此它无法使用实际数据。因此,适配器会将这些最佳猜测排除在外。稍后,使用实际数据(重新)创建布局,这就是为什么您看到每行创建两次的原因。

同样,CursorAdapter应该自己维护适当的行,您不需要此行:

this.cur.moveToPosition((int)(getItemId(position) - 1));

08-04 13:07