【Android】ListViewマルチモードの使用

48966 ワード

【キーワード】ListView  
【問題】
ListViewの複数選択モードの使用方法
【効果図】
【分析】
あるitemを長く押すと、マルチ選択モードがオンになり、現在選択されているitemが選択されます.
ListViewのChoice属性を利用すると、複数選択モードや単一モードを簡単に使用できます.
【解決策】
メソッド長を使用してitemを押してマルチ選択モードをオンにします

  
  
  
  
final ListView lvMain = (ListView) view.findViewById(R.id.lv_main);
// ;
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
 
if (adapterView instanceof AbsListView) {
// None ( ), ;
if (((AbsListView) adapterView).getChoiceMode() == AbsListView.CHOICE_MODE_NONE) {
// : ;
Vibrator vibrator = (Vibrator) mContext.getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(100);
 
enableMultipleChoice(true);
// ;
mLouAdapter.getBindListView().setItemChecked(i, true);
return true;
}
}
return false;
}
});
 
private void enableMultipleChoice(boolean enable) {
if (enable) {
mLouAdapter.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
} else {
mLouAdapter.clearChoice();
}
}

複数選択モードをオフにする

  
  
  
  
enableMultipleChoice(false);

【コード】
前節の「Android」汎用Adapterと併せて、以下のコード

    
    
    
    
// -------- choice (2016.03.25)
public void clearChoice() {
mListView.clearChoices();
updateChange(); // , ;
mListView.post(new Runnable() {
@Override
public void run() {
// Runnable ;
// [ListView selection remains persistent after exiting choice mode] (http://stackoverflow.com/questions/9754170/listview-selection-remains-persistent-after-exiting-choice-mode)
mListView.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
}
});
}
 
public void setChoiceMode(int mode) {
mListView.setChoiceMode(mode);
}
 
public int getChoiceMode() {
return mListView.getChoiceMode();
}
 
public void deleteChoicedItem() {
if (mListView.getChoiceMode() != AbsListView.CHOICE_MODE_NONE) {
// ITEM;
SparseBooleanArray sparseBooleanArray = mListView.getCheckedItemPositions();
ArrayList<T> deleteLists = new ArrayList<T>();
for (int i = 0; i < sparseBooleanArray.size(); i++) {
if(sparseBooleanArray.valueAt(i)){
deleteLists.add(mLists.get(sparseBooleanArray.keyAt(i)));
}
}
mLists.removeAll(deleteLists);
mListView.clearChoices();
updateChange();
}
}
// ~~~~~~~~~~~~
を[LouAdapter.java]に追加します.
使用中は、ListViewのitem_Layoutのルートレイアウトにバックグラウンドを追加(選択されていない場合は表示されません)

    
    
    
    
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="88dp"
android:paddingBottom="4dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:background="@drawable/lv_item_selector"
android:paddingTop="8dp">
[lv_item_selector.xml]

    
    
    
    
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/lv_item_state_activated_pressed" android:state_activated="true" android:state_pressed="true"/>
<item android:drawable="@color/lv_item_state_activated" android:state_activated="true"/>
<item android:drawable="@color/lv_item_state_pressed" android:state_pressed="true"/>
<item android:drawable="@color/lv_item_state_normal"/>
</selector>
[cors.xml]

    
    
    
    
<color name="lv_item_state_activated">#994455</color>
<color name="lv_item_state_activated_pressed">#d72e50</color>
<color name="lv_item_state_pressed">#88eec99d</color>
<color name="lv_item_state_normal">#e29944</color>
【参考資料】