Android 可编辑ListView-使用UI值更新适配器

Android 可编辑ListView-使用UI值更新适配器,android,android-listview,Android,Android Listview,我想在Android中创建一个ListView,在这里我可以添加一个新的空行,并且可以编辑新行中的控件。然后在某个事件中(或者用户再次单击add,选择另一行,或者我还没有确定的其他触发器),我想用用户在可编辑行中输入的任何值更新适配器 我目前在每一行中都有可编辑的控件,并且能够通过菜单项添加一个空行。我不知道如何将用户输入的数据与适配器同步 我最初认为适配器是双向数据绑定,但事实似乎并非如此。根据我的研究和实验,如果我更改适配器值并调用notifyDataSetChanged(),则UI会得到更

我想在Android中创建一个ListView,在这里我可以添加一个新的空行,并且可以编辑新行中的控件。然后在某个事件中(或者用户再次单击add,选择另一行,或者我还没有确定的其他触发器),我想用用户在可编辑行中输入的任何值更新适配器

我目前在每一行中都有可编辑的控件,并且能够通过菜单项添加一个空行。我不知道如何将用户输入的数据与适配器同步


我最初认为适配器是双向数据绑定,但事实似乎并非如此。根据我的研究和实验,如果我更改适配器值并调用notifyDataSetChanged(),则UI会得到更新。是否存在反向操作?

您的问题是,例如,列表中可能有300个条目(由EditItems表示),但实际上只有12-20个可回收的EditItems。 我想你知道use已经完成了他的行的唯一方法就是关注你的每个视图。 一旦焦点关闭,请使用:

  • 在适配器的getView中使用:如果v是您的视图,则执行v.setTag(位置)
  • 在OnFocusChangedListener中,一旦焦点关闭,就使用:int pos=(Integer)v.getTag();mAdapter.updatePosition(文本,位置)
  • 确保适配器具有更新方法,该方法将使用字符串“text”更新位置pos中的对象

  • 通过向行视图中的每个控件添加KeyListener和OnFocusChangeListener,我能够完成双向数据绑定。这两个事件都将调用我在行的视图上创建的方法,以循环查看视图上的所有控件,并使用当前值更新适配器的数据。我必须确保不调用notifyDataSetChanged()。仅当以编程方式更改数据源对象并使UI反映更改时,才需要此方法

    这不是有史以来最有效的方法,但它运行良好

    另一件需要注意的事情是,添加和删除行需要设置适配器视图更新的控件级和视图级静噪。对于删除,我所做的是在我的行的视图上添加一个长时间单击事件,以获得一个带有删除选项的菜单。然后,我开始在视图级别抑制更新,因为我以编程方式编辑数据源对象以删除给定的行数据,并调用notifyDataSetChanged()(必要时,否则操作系统将引发异常)。这里的静噪可以确保我不会命中我的事件并进入无限循环,并且我的数据正确同步。然后在“已删除的行”视图中,我将所有控件设置为压制其事件的更新适配器。这是因为删除的行视图仍将具有焦点,并且我希望确保不会使用UI上没有的值更新数据源对象。一旦我从适配器的getView()中的ListView循环过程中获取行的视图,该标志就会被翻转


    添加新行时,我还需要在该行的视图级别上进行静噪。这是因为我以编程方式使用新的空数据行更改数据源,并调用notifyDataSetChanged。原因与删除完全相同。

    要稍微改进C Nick的解决方案,可以使用EditText.addTextChangedListener

    如何编辑ListView中的值?一旦更改数据集并调用notifyDataSetChanged(),您就应该能够查询ListView项中输入的数据。我发现onFocusChangedListener存在问题:1)仅当我使用轨迹球从第1行的一个可编辑控件导航到第2行的下一个可编辑控件时,才会触发此操作。2) 单击列表之外的任何按钮都不会触发此事件。3) 滚动列表不会触发此事件。