将列表视图滚动到新添加项目的位置

Posted

技术标签:

【中文标题】将列表视图滚动到新添加项目的位置【英文标题】:Scrolling the listview to position of the newly added item 【发布时间】:2021-02-08 17:18:09 【问题描述】:

我有一个带有列表视图的自定义适配器。我从 SQL Server 查询项目并使用我的列表视图将它们显示为列表。我在列表视图中有项目点击监听器,以便获取项目位置。

  public void getData() 
    String query = "SELECT * FROM Table";
    List<Map<String, String>> data = new ArrayList<>();
    data = filterData(query);
    adapter = new ContactListAdapter(this, data, R.layout.items, from, to);
    listView.setAdapter(adapter);
    listView.invalidateViews();


    listView.setOnItemClickListener((adapterView, view, i, l) -> 
        HashMap<String, String> retreive = (HashMap<String, String>) adapterView.getAdapter().getItem(i);
        callerID = retreive.get("CallerDetailID");
        .
        .
    );

我使用 hashmap 字符串将值存储在一个列表中,如下所示。

// filter the contact details from sql server
List<Map<String, String>> filterData(String query) 
    List<Map<String, String>> contact_details = new ArrayList<>();
    try 
        connect = connectionClass.CONN();  // Connect to database
        Statement stmt = connect.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) 
            Map<String, String> datanum = new HashMap<>();
            datanum.put("CallerDetailID", rs.getString("CallerID"));
            .
            .
            .
            contact_details.add(datanum);
        
     catch (Exception e) 
        e.printStackTrace();
    
    return contact_details;

我知道我可以通过单击将项目放到该位置(因为我已经使用了setOnItemClickListener)。但我的问题是如何在不点击项目的情况下滚动到列表视图中新添加项目的位置?

一旦获得项目的位置,我可以在列表视图中使用以下方法之一进行滚动。

    listView.smoothScrollToPosition();
    listView.smoothScrollToPosition();
    listView.smoothScrollToPositionFromTop();

是否可以在不单击列表视图中的项目的情况下将项目定位?大家有什么想法。

【问题讨论】:

你可以简单地做listView.indexOf(newlyAddedItem),你会得到那个特定的项目索引,然后你可以使用listView.smoothScrollToPosition()平滑滚动] listView.indexOf()..,不存在?!你确定吗? 嘿伙计,我刚刚看到您的listView 是 RecyclerView/ListView 而data 是其中使用的实际数据列表,所以它应该是data.indexOf()。请试试这个,让我知道这是否适合你。 @AppDev。伙计,我设法获得了最后添加的项目的索引。由于我在ascending order中查询表格和排列数据,所以列表视图中新添加的项的定位是不同的。有什么想法吗? 【参考方案1】:

要实现该行为,您需要添加一个属性以自动滚动 listview

android:transcriptMode="alwaysScroll"

您只需调用 notifyDataSetChanged(),您的列表就会自动滚动。

【讨论】:

这很有效。它只是滚动列表但到底部。它不会滚动到新添加的项目。

以上是关于将列表视图滚动到新添加项目的位置的主要内容,如果未能解决你的问题,请参考以下文章

删除最旧的项目时防止 ListView 垂直滚动

如何自动滚动到网格视图的末尾?

如何滚动 ListView 中的项目使其可见?

如何将Listview数据裁剪到android中的滚动位置?

添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

有啥方法可以滚动到 Flutter 列表视图中的某个位置