当前位置: 首页 > 知识库问答 >
问题:

为CursorAdapter中的可见视图传递相同的convertView实例

陶博赡
2023-03-14

我在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(277250):convertview为空!D/thisItem(27725):此项为索引0android.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()结束D/dd(27735):getView()D/ddandroid.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()结束D/dd(27735):getView()D/ddandroid.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()结束D/dd(27735):getView()D/ddandroid.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()的结尾D/dd(277250):getView()D/ddandroid.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()结束D/dd(27735):getView()D/ddandroid.widget.LinearLayout@40fb5f7040fb5f70x:0.0 y:0.0 D/dd
(27725):getView()D/dd结束(27725:getView(!D/thisItem(27725):此项为索引1android.widget.LinearLayout@40fb89f840fb89f8x:0.0 y:0.0 D/dd
(27725):getView()D/dd结束(27725:getView(!D/thisItem(27725):此项为索引2android.widget.LinearLayout@40fb9c4840fb9c48x:0.0 y:0.0 D/dd
(27725):getView()D/dd结束(27725:getView(!D/thisItem(27725):此项为索引3android.widget.LinearLayout@40fbae9840fbae98x:0.0 y:0.0 D/dd
(27725):getView()结束D/dd(27735):getView()D/D
(277205):convertview为空!D/thisItem(27725):此项为索引4android.widget.LinearLayout@40fbc0e840fbc0e8x:0.0 y:0.0 D/dd
(27725):getView()结束

从开始可以看出,对于每个位置(0到4),发送的是相同的视图对象散列...

共有2个答案

岳良策
2023-03-14

< code>Convertview重用视图是正确的。您可以删除所有的< code>Convertview部分,确保它不会重用不需要的视图,并且您将获得想要的结果(以一些性能为代价)...).

燕砚文
2023-03-14

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

列表视图以您看到的“试运行”方式调用 getView() 的原因有很多,最常见的原因是因为您使用了wrap_content作为 ListView 的高度。Android必须夸大一堆行来计算wrap_content的高度,但它不能使用真实数据,因为这还不可用。因此,适配器抛出了这些最佳猜测。稍后,将使用实际数据(重新)创建布局,这就是为什么您看到每行创建两次的原因。

CursorAdapter也应该维护适当的行本身,您不需要这一行:

this.cur.moveToPosition((int)(getItemId(position) - 1));
 类似资料:
  • 我有一个布局,即MotionLayout,它必须为我定义了motionscene约束集开始和结束的FrameLayouts。并且它们是正确的动画。 然后,在这个动画框架布局下,我添加了两个文本视图,在单击时,我尝试隐藏一个,显示另一个,但两个都保持可见 重写有趣的onViewCreated(View:View,SavedInstanceState:Bundle?){super.onviewcrea

  • 我正在为我们的CMS应用程序中的一个网站创建一个表单,该应用程序使用了谷歌新的隐形reCaptcha。 然而,我被困在如何使用reCaptcha的回调上? 在使用验证码之前,代码非常简单: HTML jQuery 库具有验证特定表单并将数据发送到处理表单数据的脚本的函数。 现在,我想将reCaptcha添加到表单中。文件说明如下: 1创建一个div与data-size='不可见'。 2打电话给gr

  •     1号  1号      1号     10号                                                                                                   10号                                         5号        5号        5号         

  • JavaFX2教程有一个地址簿示例,它是一个表视图。 辅导的:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACFEHBI 编辑单元格的增强功能:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm 修改以添加复选框:h

  • 我遇到了以下两个依赖项的问题: org.apache.felix"org.apache.felix.utils" 和 通用域名格式。github。rotty3000»phidias»0.3.2 它们都对组织有可传递的依赖关系。奥斯基。核心,felix依赖于版本4.1.0,phidias依赖于版本5.0.0 我们需要5.0.0版本才能正确编译代码 如果我把我的依赖项作为: Maven自动获取版本4.