Java 在ListView中取消选择项

Java 在ListView中取消选择项,java,android,xml,android-listview,android-dialogfragment,Java,Android,Xml,Android Listview,Android Dialogfragment,这是一个场景: 在ListView中,我希望所选项目保持选中状态,直到用户单击DialogFragment按钮。问题是,如果用户单击“上一步”按钮,而没有在DialogView中单击任何按钮,则ListView中的项目仍处于选中状态 我读了,解决方案运行得很好:我点击一个项目,对话框出现,我点击后退按钮,选择器不见了 但是如果我滚动列表,选择器会返回!我错在哪里 代码如下: <ListView android:layout_width="fill_parent"

这是一个场景: 在ListView中,我希望所选项目保持选中状态,直到用户单击DialogFragment按钮。问题是,如果用户单击“上一步”按钮,而没有在DialogView中单击任何按钮,则ListView中的项目仍处于选中状态

我读了,解决方案运行得很好:我点击一个项目,对话框出现,我点击后退按钮,选择器不见了

但是如果我滚动列表,选择器会返回!我错在哪里

代码如下:

<ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/listView"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="15dp"
        android:divider="@android:color/transparent"
        android:visibility="visible"
        android:dividerHeight="5dp"
        android:choiceMode="singleChoice"
        android:drawSelectorOnTop="true"
        android:listSelector="@color/primario_1_alfa"/>

这是由于使用ViewHolder模式循环使用视图

由于您在任何时候都只需要一个选择项,因此可以跟踪在适配器中选择的项的位置,然后对照要使用ViewHolder数据填充的视图的当前位置检查该位置

int selectedPosition;
...
onItemClickListener(int position, ...) {
   selectedPosition = position;
}
...
getView(int position, ...) {

   if (selectedPosition == position) {
      view.setSelected(true);
   } else {
      view.setSelected(false);
   }
}

这是由于使用ViewHolder模式回收视图造成的

由于您在任何时候都只需要一个选择项,因此可以跟踪在适配器中选择的项的位置,然后对照要使用ViewHolder数据填充的视图的当前位置检查该位置

int selectedPosition;
...
onItemClickListener(int position, ...) {
   selectedPosition = position;
}
...
getView(int position, ...) {

   if (selectedPosition == position) {
      view.setSelected(true);
   } else {
      view.setSelected(false);
   }
}

类似于这些内容。

您是否将ViewHolder模式用于列表适配器?是的,我使用该模式是因为视图的循环使用。您是否将ViewHolder模式用于列表适配器?是的,我使用该模式是因为视图的循环使用。抱歉@androidpotato7,但我需要更多提示:)。对话框关闭后,我不需要选择任何行,我认为
view.setSelected(false)对于每一行,这就足够了,但它不起作用。在您的解决方案中,我按照您的建议修改了适配器的getView方法,并添加了代码
selectedPosition=position。如果我希望所有回合都没有选择器,为什么我需要这个职位?谢谢:)因为视图可以随时回收,你永远不会知道。因此,至少getView中的selectedPosition和if允许您精确地控制谁被选中或不被选中。实现我提出的解决方案,在对话框关闭后,在适配器上调用notifyDatasetChange(),所有视图都将被重新绘制,并且由于没有选择任何位置(给定selectedPosition=-1),所有视图都将使用selected==false@androidpotato7绘制,但我需要更多提示:)。对话框关闭后,我不需要选择任何行,我认为
view.setSelected(false)对于每一行,这就足够了,但它不起作用。在您的解决方案中,我按照您的建议修改了适配器的getView方法,并添加了代码
selectedPosition=position。如果我希望所有回合都没有选择器,为什么我需要这个职位?谢谢:)因为视图可以随时回收,你永远不会知道。因此,至少getView中的selectedPosition和if允许您精确地控制谁被选中或不被选中。实现我提出的解决方案,在对话框关闭后,在适配器上调用notifyDatasetChange(),所有视图都将被重新绘制,因为没有选择任何位置(给定selectedPosition=-1),所有视图都将使用selected==false绘制