理解できなかった質問がいくつかあります。
私はすべてのチェックされた要素をListView
から取得しようとしていますが、:
要素をチェックしてからチェックを外すと、getCheckedItemPositions()
関数によって「チェック済み」として返されます
私はこれをどのように繰り返すことができますかわかりません:
SparseBooleanArray checked = list.getCheckedItemPositions();
私はこれで私のケースを解決しました:
public class MyAdapter extends BaseAdapter{
public HashMap<String,String> checked = new HashMap<String,String>();
....
public void setCheckedItem(int item) {
if (checked.containsKey(String.valueOf(item))){
checked.remove(String.valueOf(item));
}
else {
checked.put(String.valueOf(item), String.valueOf(item));
}
}
public HashMap<String, String> getCheckedItems(){
return checked;
}
}
要素を設定するにはチェックされます:
public class FileBrowser extends Activity implements OnClickListener{
private ListView list;
...
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int item,
long id) {
BrowserAdapter bla = (BrowserAdapter) parent.getAdapter();
bla.setCheckedItem(item);
}
});
次に、クラス外からチェック済みアイテムを取得します。
MyAdapter bAdapter;
Iterator<String> it = bAdapter.getCheckedItems().values().iterator();
for (int i=0;i<bAdapter.getCheckedItems().size();i++){
//Do whatever
bAdapter.getItem(Integer.parseInt(it.next());
}
それが誰かを助けることを願っています。
SparseBooleanArray
を使用する他の答えはほぼ正しいですが、1つの重要なことを見逃しています:SparseBooleanArray.size()
はtrue
値のカウントのみを返すことがあります。リストのすべての項目を反復処理する正しい実装は次のとおりです。
SparseBooleanArray checked = list.getCheckedItemPositions();
for (int i = 0; i < list.getAdapter().getCount(); i++) {
if (checked.get(i)) {
// Do something
}
}
Jarettの答えは素晴らしいですが、基礎となる配列に存在するスパース配列の要素のみをチェックしているため、これは少し高速になります(trueにできるもののみ)。
SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
final int checkedItemCount = checkedItemPositions.size();
for (int i = 0; i < checkedItemCount; i++) {
int key = checkedItemPositions.keyAt(i);
if (checkedItemPositions.get(key)) {
doSomething(key);
} else {
// item was in the sparse array, but not checked.
}
}
プロのヒント:SparseBooleanArrayのソースを見てください。これは非常に単純なクラスです。
ForループとSparseBooleanArrayのsize()およびget(index)メソッドを使用して、SparseBooleanArrayを反復処理できます。
編集3/2/2014:人々は、SparseBooleanArrayのsize()メソッドが配列の実際の長さではなく、チェックされた値の数を返すことを指摘しているので、それを説明するために答えを修正しました。基本的に同じです。ただし、配列の長さを反復処理するのではなく、すべてのチェック済みアイテムが見つかるまで反復処理を行います。チェックするアイテムの数だけを気にするので、このメソッドでは、実際に配列の最後に到達しない可能性があります(最後にチェックしたアイテム以降は何も表示されません)。
SparseBooleanArray checked = list.getCheckedItemPositions();
int numChecked = checked.size();
for (int i = 0; numChecked > 0; i++){
if (checked.get(i)){
//the item at index i is checked, do something
numChecked--; //We found a checked item, so decrement the number of checked items remaining
}
else
//the item is not checked, do something else
}
私の脳はSparseBooleanArrayをループすることを好まなかったし、カスタムアダプターを必要としなかったので、以下は少し直感的でした。
OnCreate()でCHOICE_MODE_MULTIPLEを使用することを忘れないでください:
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
次のメソッドを使用して、それらのArrayListを取得します。
// This example is to get an ArrayList of names (Strings)
protected ArrayList<String> getNames() {
ArrayList<String> names = new ArrayList<String>();
for (int i = 0; i < getListView().getCount(); i++) {
if (getListView().isItemChecked(i)) {
// Do whatever you need to in here to get data from
// the item at index i in the ListView
names.add(mUsers.get(i).getName());
}
}
return names;
}
final long[] checkedIds = lv.getCheckItemIds();
for (int i = 0; i < checkedIds.length; i++) {
Log.d("checkedIds", "id checked: " + checkedIds[i]);
}
質問を見て、同じ問題に直面していました。
SparseBooleanArrayを使用して、チェックされるアイテムの数を正確にカウントする簡単なソリューションがあります。これは私のonClick手順です:
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.button:
SparseBooleanArray a = listView.getCheckedItemPositions();
if(checked(vArray)>0) {
String vCheckedList = "";
for (int i = 0; i < nLength; i++) {
if (a.valueAt(i) && i < nLength-1 && a.size()>1)
vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i))+"\n";
else if (a.valueAt(i))
vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i));
}
Toast.makeText(getApplicationContext(), vCheckedList+ " is checked", Toast.LENGTH_SHORT).show();
a.clear();
} else
Toast.makeText(getApplicationContext(), "No Item is Selected", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
チェックされたメソッド:
private int checked(SparseBooleanArray vArray) {
int vCounter = 0;
for(int i=0;i<vArray.size(); i++)
if(vArray.valueAt(i))
vCounter++;
return vCounter;
}
チェックされたアイテムの両方の問題を解決します。
私は同じ問題を抱えていましたが、これはSparseBooleanArray
での私の解決策です:
SparseBooleanArray checkedPositions = lv.getCheckedItemPositions ();
int size = checkedPositions.size ();
for (int i=0 ; i<size ; i++) {
// We get the key stored at the index 'i'
int key = checkedPositions.keyAt (i);
// We get the boolean value with the key
Log.i (Tag, "checkedPositions(" + key + ")=" + checkedPositions.get (key));
}
PosはRecyclerviewアイテムの位置です
_SparseBooleanArray selected = new SparseBooleanArray();
//OnClick listener here or whatever you use to check or uncheck an item
if (selected.get(pos, false)) {
selected.delete(pos);
} else {
selected.put(pos, true);
}
_
selected.size()
は、選択されているアイテムの数を表示します
selected.get(pos)
は、選択されている場合にtrueを返します
述べられているように、以下は、選択されたすべてのアイテムに対して繰り返されます。
_for (int i = 0; i < list.getAdapter().getCount(); i++) {
if (selected.get(pos)) {
// Do stuff
}
}
_