2011-03-24 86 views
0

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

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

我原本以为Adapters是双向数据绑定,但似乎并非如此。从我的研究和实验中,如果我更改适配器值并调用notifyDataSetChanged(),那么UI将得到更新。是否有逆向操作?

+0

如何编辑ListView中的值?一旦更改了数据集并调用了notifyDataSetChanged(),您应该能够查询ListView项目以获取放入其中的数据。 – LeffelMania 2011-03-24 20:24:43

回答

2

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

不是最有效的方式,但它运作得很好。

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

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

0

你的问题是你的帽子,例如可能有300个项目在列表上(这是由EditItems重复),但实际上只有12-20个EditItems被回收。 我想你唯一的方法来知道使用已完成与他的行是FocsedChangedListener在每个视图。 一旦重点是关闭使用:

  1. 在适配器中的getView使用:如果v是您查看,然后做v.setTag(位置)
  2. 在OnFocusChangedListener一次重点是关闭使用:INT POS =(整数) v.getTag(); mAdapter.updatePosition(文字,POS)
  3. 确保您的适配器有一个updat mthod将与字符串“文本”
+0

我用onFocusChangedListener看到的问题:1)如果我使用轨迹球从第1行中的一个可编辑控件导航到第2行中的下一个可编辑控件,这只会被解雇。2)单击列表外的任何按钮都不会触发此操作事件。 3)滚动列表不会触发此事件。 – 2011-03-25 14:25:19

0

为了细化C Nick的解决方案,你可以使用EditText.addTextChangedListener。