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

时间:2011-03-24 20:20:16

标签: android android-listview

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

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

我原本以为Adapters是双向数据绑定,但似乎并非如此。从我的研究和实验中,如果我更改了Adapter值并调用notifyDataSetChanged(),则UI会更新。有反向操作吗?

3 个答案:

答案 0 :(得分:2)

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

不是最有效的方式,但效果不错。

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

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

答案 1 :(得分:0)

你的问题就是你的问题,例如可能在列表上有300个项目(由EditItems重复),但实际上只有12-20个EditItems被回收。 我想你知道你的每一个视图都是FocsedChangedListener的唯一方法。 一旦焦点停止使用:

    适配器的getView使用中的
  1. :如果v是你的View,那么执行v.setTag(position)
  2. 一旦焦点关闭,OnFocusChangedListener中的
  3. :int pos =(Integer)v.getTag(); mAdapter.updatePosition(文本,POS)
  4. 确保您的适配器有一个updat方法,它将使用字符串'text'更新位置pos中的对象

答案 2 :(得分:0)

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