Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从多个选择列表视图返回值_Android_Listview_Multiple Select - Fatal编程技术网

Android 从多个选择列表视图返回值

Android 从多个选择列表视图返回值,android,listview,multiple-select,Android,Listview,Multiple Select,编辑:好的,我找到了解决办法。我不知道这是正确的解决方案,但它确实工作正常。添加到下面的代码中 我试图允许用户从清单中选择一些目录,并在单击“提交”按钮时返回它们。这是我的一段代码。它用/sdcard/上的所有目录填充ListView,对于提交时的初始选择(无论选择多少),日志显示返回的正确选择。但是,如果我取消选中某个项目,然后再次单击“提交”,它仍然会显示为“全部已选中”。我是否需要编写一个处理程序来取消选中项目?我以为这是由choiceMode选择解决的?谢谢 private Sparse

编辑:好的,我找到了解决办法。我不知道这是正确的解决方案,但它确实工作正常。添加到下面的代码中

我试图允许用户从清单中选择一些目录,并在单击“提交”按钮时返回它们。这是我的一段代码。它用/sdcard/上的所有目录填充ListView,对于提交时的初始选择(无论选择多少),日志显示返回的正确选择。但是,如果我取消选中某个项目,然后再次单击“提交”,它仍然会显示为“全部已选中”。我是否需要编写一个处理程序来取消选中项目?我以为这是由choiceMode选择解决的?谢谢

private SparseBooleanArray a;    
directoryList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, directoryArray));
    submitButton = (Button)findViewById(R.id.submit_button);
    submitButton.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View v)
        {
            a = new SparseBooleanArray();
            a.clear();
            a = directoryList.getCheckedItemPositions();

            for (int i = 0; i < a.size(); i++)
            {
                //added if statement to check for true. The SparseBooleanArray
                //seems to maintain the keys for the checked items, but it sets
                //the value to false. Adding a boolean check returns the correct result.                    
                if(a.valueAt(i) == true)
                    Log.v("Returned ", directoryArray[a.keyAt(i)]);

            }                
        }
    });
专用SparseBooleanA数组;
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_multiple_selection,directoryArray));
submitButton=(按钮)findViewById(R.id.submit_按钮);
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
a=新SparseBooleanArray();
a、 清除();
a=directoryList.getCheckedItemPositions();
对于(int i=0;i
又进行了一些调试,找到了一个适合我的解决方案。编辑成上面的代码。出于某种原因,SparseBooleanArray本身并不为空;它维护已选中框的键。但是,当调用getCheckEditePositions()时,它会将该值设置为false。因此,密钥仍在返回的数组中,但其值为false。只有复选框将被标记为true值。

本不打算这样做作为答案,但我必须详细介绍您在执行multi-select时所做的操作。为什么要为选择设置字段变量?我刚做了本地SparseBooleanArray

public class NaughtyAndNice extends ListActivity {
TextView selection;
String[] items={"lorem","ipsum", "dolor", "sit", "amet",
        "consectetuer", "adipisc", "jklfe", "morbi", "vel",
        "ligula", "vitae", "carcu", "aliequet"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,items));
           selection = (TextView)findViewById(R.id.selection);
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}

public void onListItemClick(ListView parent, View view, int position, long id){
    SparseBooleanArray choices = parent.getCheckedItemPositions();
    StringBuilder choicesString = new StringBuilder();
    for (int i = 0; i < choices.size(); i++)
    {
    //added if statement to check for true. The SparseBooleanArray
    //seems to maintain the keys for the checked items, but it sets
    //the value to false. Adding a boolean check returns the correct result.                    
        if(choices.valueAt(i) == true)
            choicesString.append(items[choices.keyAt(i)]).append(" ");

    } 
    selection.setText(choicesString);
}
}
公共类顽皮Dnice扩展ListActivity{
文本视图选择;
字符串[]项={“lorem”、“ipsum”、“dolor”、“sit”、“amet”,
“Concertetuer”、“adipisc”、“jklfe”、“morbi”、“vel”,
“ligula”、“vitae”、“carcu”、“aliequet”};
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_multiple_selection,items));
selection=(TextView)findViewById(R.id.selection);
this.getListView().setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE);
}
public void onListItemClick(列表视图父项、视图视图、整型位置、长id){
SparseBooleanArray choices=parent.getCheckEditePositions();
StringBuilder ChoiceString=新StringBuilder();
for(int i=0;i


我知道您找到了一个适合您的解决方案,但最简单、更干净的解决方案可能在大多数情况下都有效(我希望保留所选元素的所有ID):

(在我的列表活动中):

SparseBooleanArray selectedPos=getListView()
.GetCheckEditePositions();
ListAdapter lAdapter=getListAdapter();
列表ID=新的ArrayList();
对于(int i=0;i
无需使用
SparseBooleanArray choices=parent.getCheckedItemPositions()


StringBuilder
就足够了。

执行for循环,然后在for循环内执行keyAt…似乎效率极低。。。keyAt运行得有多糟?哦,我不明白这段代码的区别…它的功能似乎与我的完全相同。哦,没关系,我错过了你的问题。没有真正的理由为SBA做类变量,我只是刚接触Java和Android,做得很愚蠢。:)
SparseBooleanArray selectedPos = getListView()
        .getCheckedItemPositions();

ListAdapter lAdapter = getListAdapter();
List<Long> ids = new ArrayList<Long>();
for (int i = 0; i < lAdapter.getCount(); i++) {
    if (selectedPos.get(i)) {
        ids.add(lAdapter.getItemId(i));
    }
}