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

滚动listView后,convertView丢失onitemClick

罗凯
2023-03-14

我的适配器上有一个有点奇怪的错误。适配器正在创建的视图是左侧的缩略图和包含几行的表格。每行有两个文本视图。

其中一个文本视图具有android: autoLink="web"属性集,并且列表视图上有一个onItemClickListener。

问题是每次TextView自动链接它的内容时,下一次它的父视图被转换时,它不再接收来自onItemClickListener的点击。

让我用一个例子来澄清:

    < li >视图1、视图2、视图3和视图4位于屏幕上的列表视图中。 < li >视图2有一个链接,它会出现,单击该链接会打开。 < li >项目click对于视图1、视图3和视图4正常工作。 < li >滚动列表视图,视图1被转换到位置5,然后视图2被转换到位置6。 < li >位置6处的项目不包含链接,但是也不会为位置6元素触发onItemClick。

文本视图的自动链接功能确实改变了我的布局,但我不知道是什么。在我的适配器上,必须有一个我可以为每次getView调用重置的属性,但是是哪个呢?

感谢您的任何帮助。

编辑

让我们看看一些代码,这是非常标准/良好的实践。从我的适配器获取视图是: @Override 公共视图 getView(整数位置, 视图转换视图, 视图组父级) {

    // Inflate a new layout if needed
    if (convertView == null)
        convertView = createNewView();

    // Gets the item from my array
    AGplus item = (AGplus) getItem(position);
    // Gets the holder pointing to the views
    Holder h = (Holder) convertView.getTag();
    // That's a test version, I won't be using date.toString() later on
    h.date.setText(new Date(item.getDate()).toString());
    // This guys is giving me a headache,
    // If it parses the link, I can't never click on this convertView anymore,
    // event re-converting them for a text that does not contain links
    h.txt.setText(item.getTitle());


    // some image download stuff that doesn't matter for this code

    return convertView;
    }

所使用的布局是一个图像和表格,我在表格上充气和插入的行数因适配器而异。表格布局是带有图像视图的水平线性布局,表格布局带有一些边距内容,以下是行布局:

    <?xml version="1.0" encoding="utf-8"?>
    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="@color/text" />

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:autoLink="web"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="@color/text" />

    </TableRow>

如果我完全删除android: autoLink="web",我会得到所有点击,但如前所述,一旦一个视图被“自动链接”,然后我回收该视图,我就无法再次点击该视图。

编辑

这是布局膨胀:

    private View createNewView() {

    // Instantiate view
    View v = getLayoutInflater().inflate(R.layout.expandable_child_view, null);
    TableLayout table = (TableLayout) v.findViewById(R.id.table);
    Holder h = new Holder();
    v.setTag(h);

    // Instantiate rows
    h.thumb = (ImageView) v.findViewById(R.id.img);
    h.date = (TextView) createNewRow(table, "Date: ");
    h.txt = (TextView) createNewRow(table, "Text: ");
    return v;
    }

    private View createNewRow(ViewGroup group, String title) {
    View row;
    row = getLayoutInflater().inflate(R.layout.item_table_row, null);
    ((TextView) row.findViewById(R.id.title)).setText(title);
    group.addView(row);
    return row.findViewById(R.id.text);
    }

在别人问之前,这是expandable_child_view布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical" >

        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="20dp"
            android:src="@drawable/ic_launcher" />

        <TableLayout
            android:id="@+id/table"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </TableLayout>
    </LinearLayout>

正如我之前所说,只是一个线性布局,一个imageview和一个表格和一些空白。

共有2个答案

金高轩
2023-03-14

我想我知道发生了什么。当你使用setText()时,有时会删除很多东西。您可能需要使用ClickableSpan将链接操作放回到textview中。

施翰学
2023-03-14

根据Romain Guy的说法,这是为了支持轨迹球/dpad导航而设计的。注释27有一个解决方法,通过在每个listview项目上设置后代焦点可用性:

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

android:descendantFocusability="blocksDescendants"
 类似资料:
  • 我使用JavaFX ListView作为聊天应用程序的聊天室主体。当消息到来或正在发送时,我会添加到listview。这很好,但我总是不得不滚动找到最新的消息。有没有任何方法,我可以自动滚动到底部,以便显示最新的消息,而不必一直向下滚动?

  • 问题内容: 我有两个ListView要滚动在一起的对象。它们 并排放置,因此,如果一个滚动一定数量,则另一个滚动相同 数量。我已经找到了一些有关如何执行此操作的示例,但我相信它们 依赖于ListView高度相同的项目(如果我 错了,请纠正我)。我的一个ListView对象中的项目比另一个对象中的项目高 ,跨越2-3个项目。 如何将这两个对象“锁定”在一起? 编辑:这是我所拥有的屏幕截图,也许它将更

  • 我的问题:我的ListView中的一个项目在我开始滚动后会动画。它不是最后一项,动画应该完成。一旦问题消失,我滚动后,它只发生一次,并且只发生在列表中的单个项目上。 在我开始滚动ListView之后,如何停止单个项目的动画制作? 我希望在将项目添加到适配器时,动画仅运行一次。 我有一个列表适配器,当项目添加到列表中时,我在其中对它们进行动画处理。我正在使用声明的动画器在适配器的getView()方

  • 我用了这个尺寸的盒子,似乎还是有错误。 这是我的小部件树:SingleChildScrollView- 医生总结(查看所有细节,运行颤动医生-v): 颤动(频道beta,v0.4.4,Mac OS X 10.13.1 17B1003,语言环境en-HK) [✓] Android工具链-为Android设备开发(Android SDK 26.0.2) iOS工具链-为iOS设备开发(Xcode 9.

  • 我使用的是底部导航栏,每个菜单将用户导航到特定的可组合屏幕。我使用了导航库来管理它们之间的导航。 我正在为所有可组合使用通用的ViewModel。我正在其中一个可组合中使用懒惰列,当我在底部导航栏中单击菜单项在菜单项之间导航时,它会按预期工作,在懒惰列的滚动位置保存的位置。 当我在具有一个lazyColumn的可组合屏幕中单击按钮(我已经将它编程为导航到导航图中的起始目的地)并导航回该按钮时,问题

  • 我有一个包含我的数据的listView,但我需要能够按下向上滚动的按钮(如果listView可以向上滚动)和向下滚动的按钮(如果listView可以向下滚动),而不是使用滚动条滚动 listView可以转到的最大Y位置 listView滚动到的当前Y位置 使用这些值,我可以编写其余的代码。