从多个selectListView中返回值

编辑:好的,我find了一个解决scheme。 不知道这是正确的解决scheme,但它确实工作正常。 添加到下面的代码。

我试图让用户从清单中select一些目录,并在点击“提交”button后返回。 这是我的代码片段。 它填充所有在/ sdcard /上的目录的ListView,并且当我提交时,初始select(无论我select多less),日志显示返回的正确select。 但是,如果我取消选中一个项目,然后再次单击“提交”,它仍然显示为全部选中。 我是否需要编写一个处理程序来取消选中一个项目? 我以为是由select模式select照顾? 谢谢!

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)]); } } }); 

Solutions Collecting From Web of "从多个selectListView中返回值"

我知道你find了一个适合你的解决scheme,但是大部分时间可能工作的更干净,更简单的解决scheme就是这样(我想保留所选元素的所有ID):

(在我的ListActivity中):

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

做了更多的debugging,并find了一个解决scheme,为我工作。 编辑成上面的代码。 出于某种原因,SparseBooleanArray不会自行清空; 它维护已被检查的框的键。 但是,当调用getCheckedItemPositions()时,它将VALUE设置为false。 所以键仍然在返回的数组中,但它的值为false。 只有选中的框会被标记为真值。

并不意味着做这个答案,但我不得不扩大你做了多选的做法。 你为什么要为你的select做一个字段variables? 我只是做了当地的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); } } 

不需要使用SparseBooleanArray choices = parent.getCheckedItemPositions();

StringBuilder就足够了。