【问题标题】:Selecting multiple items in ListView在 ListView 中选择多个项目
【发布时间】:2009-09-01 13:49:26
【问题描述】:

如何在android中的ListView中选择多个项目。

【问题讨论】:

    标签: android


    【解决方案1】:

    实际上你可以;)这只是用户体验的问题,对吧?

    试试这个,(1) 用于列表控件集

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);   
    listView.setItemsCanFocus(false);
    

    (2) 定义列表项为

    <CheckedTextView 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center_vertical"
        android:paddingLeft="6dip"
        android:paddingRight="6dip"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:background="@drawable/txt_view_bg" />
    

    这与android.R.layout.simple_list_item_multiple_choice 相同,除了 android:background="@drawable/txt_view_bg

    (3) 并将drawable txt_view_bg.xml定义为

    <item android:drawable="@drawable/selected"
      android:state_checked="true" />  
    <item android:drawable="@drawable/not_selected" />
    

    注意:- 处理多项选择的首选方法是在单击项目单击时自行跟踪选择,而不是根据其在列表中的状态。

    【讨论】:

    • 我假设上面的 item 元素在一个选择器元素中,并且“selected”和“not_selected”是用户提供的可绘制对象(如图像)。有没有办法改用平台的复选框?
    • 要使用平台的复选框,请移除背景属性并忽略点 (3)。尽管为我显示了这些框,但不幸的是,我无法真正选中该框。我只能通过 xml 使用 android:checked 属性来设置默认值,但不能在运行时通过触摸来更改它。
    【解决方案2】:

    第 1 步: setAdapter 到您的列表视图。

     listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, GENRES)); 
    

    第二步:设置listview的选择模式。下面代码的第二行代表应该选中哪个复选框。

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listView.setItemChecked(2, true);
    
    listView.setOnItemClickListener(this);
    
    
    
     private static  String[] GENRES = new String[] {
            "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
            "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
        };
    

    第 3 步:选中的视图在 SparseBooleanArray 中返回,因此您可以使用下面的代码来获取键或值。下面的示例只是在单个字符串中显示选定的名称。

    @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int arg2, long arg3)
        {
    
        SparseBooleanArray sp=getListView().getCheckedItemPositions();
    
        String str="";
        for(int i=0;i<sp.size();i++)
        {
            str+=GENRES[sp.keyAt(i)]+",";
        }
        Toast.makeText(this, ""+str, Toast.LENGTH_SHORT).show();
    
        }
    

    【讨论】:

    • 如果您取消选择一个项目,它将继续出现在 toast 中。所以..如果您选择 3 个项目,然后取消选择它们并选择其他 1 个项目,则字符串将包含所有 4 个项目,即使只选择了 1 个项目。我无法解释为什么,因为我们总是有一个新的 String=""。 getCheckedItemPositions() 是否存储所有已选择的值?但这会很奇怪。解决这个问题会很好,我试过了,但我知道我无法解决它。所以,如果有人知道,请分享解决方案。
    【解决方案3】:

    此示例存储您检查的值并将它们显示在 toast 中。当您取消选中项目时它会更新http://android-coding.blogspot.ro/2011/09/listview-with-multiple-choice.html

    【讨论】:

      【解决方案4】:

      要在取消选中某些项目后“更新” Toast 消息,只需将此行放在 for 循环中:

      if (sp.valueAt(i))
      

      结果如下:

      for(int i=0;i<sp.size();i++)
      {
          if (sp.valueAt(i))
              str+=names[sp.keyAt(i)]+",";
      }
      

      【讨论】:

        【解决方案5】:

        很简单,

        listViewRequests.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                            **AppCompatCheckedTextView checkBox = (AppCompatCheckedTextView) view;**
                            Log.i("CHECK",checkBox.isChecked()+""+checkBox.getText().toString());**
        
                       }
                    });
        

        【讨论】:

          【解决方案6】:

          在listView中可以通过Adapter来使用

          ArrayAdapter<String> adapterChannels = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice);
          

          【讨论】:

            【解决方案7】:

            并得到它:

            public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
            
                            Log.d(getLocalClassName(), "onItemClick(" + view + ","
                                    + position + "," + id + ")");
                    }
                });
            

            【讨论】:

              【解决方案8】:

              你必须选择ArrayAdapter中的选项:

              ArrayAdapter<String> adapter = new ArrayAdapter<String>
                  (this, android.R.layout.simple_list_item_single_choice, countries);
              

              【讨论】:

                【解决方案9】:

                最好的方法是在多选时使用带有列表视图的上下文操作栏,您可以使用以下代码将列表视图设置为多选

                listview.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
                

                现在为Listview设置multichoice listener,可以在Android multi select listview看到multiselect listview的完整实现

                【讨论】:

                  【解决方案10】:

                  我建议根据需要检查ListActivity 的逻辑可能是不浪费太多时间的最佳方法

                  link

                  developer.android

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-11-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多