取消选择 ListView 中的项目

Posted

技术标签:

【中文标题】取消选择 ListView 中的项目【英文标题】:Deselect item in ListView 【发布时间】:2015-10-19 17:03:27 【问题描述】:

这是场景: 在 ListView 中,我希望所选项目保持选中状态,直到用户单击 DialogFragment 按钮。问题是,如果用户点击后退按钮,而在 DialogView 中没有任何点击,则 ListView 中的项目保持选中状态。

我阅读了this post,解决方案运行良好:我点击一个项目,出现对话框,我点击后退按钮,选择器消失了。

但是如果我滚动列表,选择器就会回来!我哪里错了?

代码如下:

<ListView
        android:layout_
        android:layout_
        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"/>

以及我试图取消选择列表视图元素的 DialogFragment

public class MyDialog extends DialogFragment 

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("Test dialog view")
                .setPositiveButton("action 1", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 

                    
                )
                .setNegativeButton("action 2", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 

                    
                );
        return builder.create();
    
    @Override
    public void onDestroy()
        super.onDestroy();
        ListView listView = (ListView) getActivity().findViewById(R.id.listView);
        listView.clearChoices();
        listView.requestLayout();
    

【问题讨论】:

您是否在列表适配器中使用 ViewHolder 模式? 是的,我使用那个模式 那是因为视图的回收。 【参考方案1】:

这是由于使用 ViewHolder 模式回收视图。

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

int selectedPosition;
...
onItemClickListener(int position, ...) 
   selectedPosition = position;

...
getView(int position, ...) 

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

类似的东西。

【讨论】:

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

以上是关于取消选择 ListView 中的项目的主要内容,如果未能解决你的问题,请参考以下文章

更新 ListView 中的特定项目

listview.setSelection()

从 Delegate 访问 Listview currentIndex

如何取消选择选定的列表视图项目?

如何检查 ListView 项目是不是被选中

如何在单击 ListView 中的按钮时取消选中所有列表项