2012-07-23 16 views
5

Ho una Listview personalizzata utilizzando una classe adattatore per estendere ArrayAdapter di una classe Item. Ho la possibilità di cambiare tra le modalità di scelta di NONE, Single e Multi. Tutto funziona bene. Quello che sto cercando di implementare ora è un metodo per rimuovere elementi dalla vista elenco (e dall'adattatore) con selezione multipla nella modalità multi scelta. Tuttavia ottengo eccezioni IndexOutOFBounds quando si effettua una delle seguenti operazioni; 1) rimuovere l'ultimo elemento in listview in modalità scelta SINGOLA (Nota: qualsiasi cosa prima dell'ultimo elemento rimuovere ok) 2) Nella modalità scelta multipla non posso ancora rimuovere l'ultimo elemento 3) in modalità multi selezione Posso rimuovere singolo elementi selezionati prima dell'ultimo elemento ma 2 o più selezioni generano di nuovo errori indice fuori dai limiti.Android - Adattatore ListView personalizzato - Rimuove selezione multipla - Indexoutofbounds - perché?

Ho aggiunto il registro di debug per mostrare la posizione da rimuovere e la dimensione di getCheckItemPositions() e il mio contatore for loop (ad es. I) e infine il titolo dell'articolo dell'elemento rimosso. Se commento la riga listadpter.remove (posizione) effettiva, l'output del registro sembra indicare che tutto funziona correttamente. Ora sospetto che il problema ricada nel metodo getView della mia classe adattatore. Ma il mio cervello è esausto e io sono bloccato.

MainActivity.class - metodo removeItems richiamato da un oggetto visualizzazione pulsanti;

private void removeItems() { 
    final SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 
    //final long[] checkedItemIds = listView.getCheckedItemIds(); 
    final int checkedItemsCount = checkedItems.size(); 

    Log.d("drp", "Adapter Count is: " + Integer.toString(mMyListViewAdapter.getCount())); 
    if (checkedItems != null) { 
     for (int i = checkedItemsCount-1; i >= 0 ; --i) { 
      // This tells us the item position we are looking at 
      // -- 
      final int position = checkedItems.keyAt(i); 
      // This tells us the item status at the above position 
      // -- 
      final boolean isChecked = checkedItems.valueAt(i); 

      if (isChecked) { 
       Item item = mMyListViewAdapter.getItem(position); 
       Log.d("drp", "removing : " + Integer.toString(position) + " of " +Integer.toString(checkedItemsCount) + "-" + Integer.toString(i) + " - Title: " + mMyListViewAdapter.getItem(position).getTitle()); 
       mMyListViewAdapter.remove(item); 

      } 
     } 
    } 
} 

Classe adattatore;

public class MyListViewAdapter extends ArrayAdapter<Item> implements OnItemClickListener{ 

private LayoutInflater mInflator; 

/** 
* This is my view holder for getView method so don't need to call 
* findViewById all the time which results in speed increase 
*/ 
static class ViewHolder { 

    public TextView txtTitle; 
    public TextView txtDescription; 
    public TextView txtSessionCount; 
    public ImageView listThumbnailImage; 
    public ImageView listStatusIndicatorImage; 
    public InertCheckBox Checkbox; 
} 

/** 
* Constructor from a list of items 
*/ 
public MyListViewAdapter(Context context, List<Item> items) { 
    super(context, 0, items); 
    mInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // This is how you would determine if this particular item is checked 
    // when the view gets created 
    // -- 
    final ListView lv = (ListView) parent; 
    final boolean isChecked = lv.isItemChecked(position); 
    final int selectionMode = lv.getChoiceMode(); 

    // The item we want to get the view for 
    // -- 
    Item item = getItem(position); 

    // Re-use the view if possible (recycle) 
    // -- 
    ViewHolder holder = null; 
    if (convertView == null) { 
     convertView = mInflator.inflate(R.layout.listview_row, null); 
     holder = new ViewHolder(); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.txtDescription = (TextView) convertView.findViewById(R.id.description); 
     holder.txtSessionCount = (TextView) convertView.findViewById(R.id.session_count); 
     holder.listThumbnailImage = (ImageView) convertView.findViewById(R.id.list_image); 
     holder.listStatusIndicatorImage = (ImageView) convertView.findViewById(R.id.status); 
     holder.Checkbox = (InertCheckBox) convertView.findViewById(R.id.inertCheckBox); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.txtTitle.setText(item.getTitle()); 
    holder.txtDescription.setText(item.getDescription()); 
    holder.txtSessionCount.setText(item.getSessionCount()); 
    holder.listThumbnailImage.setImageBitmap((Bitmap) item.getThumbnailImage());   
    switch (selectionMode) { 
    case ListView.CHOICE_MODE_NONE: 
     holder.Checkbox.setVisibility(InertCheckBox.GONE); 
     holder.listStatusIndicatorImage.setVisibility(ImageView.VISIBLE); 
     holder.listStatusIndicatorImage.setImageBitmap((Bitmap) item.getListIndicatorImage()); 
     break; 
    //case ListView.CHOICE_MODE_SINGLE: case ListView.CHOICE_MODE_MULTIPLE: 
    default: 
     holder.listStatusIndicatorImage.setVisibility(ImageView.GONE); 
     holder.Checkbox.setVisibility(InertCheckBox.VISIBLE); 
     holder.Checkbox.setButtonDrawable(R.drawable.checkbox); 
     holder.Checkbox.setChecked(isChecked); 
     break; 
    }   


    return convertView; 
} 

@Override 
public long getItemId(int position) { 
    return getItem(position).getId(); 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 

E classe articolo - prima metà;

public class Item implements Comparable<Item> { 

private long id; 
private String title; 
private String description; 
private String session_count; 
private Bitmap listImage; 
private Bitmap statusImage; 

public Item(long id, String title, String description, String session_count, Bitmap listImage, Bitmap statusImage) { 
    super(); 
    this.id = id; 
    this.title = title; 
    this.description = description; 
    this.session_count = session_count; 
    this.listImage = listImage; 
    this.statusImage = statusImage; 
} 

public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

Ecco visiva dei miei di debug log di tracciamento traslochi voce

07-23 22:59:14.910: D/drp(19104): Adapter Count is: 51 
07-23 22:59:14.910: D/drp(19104): removing : 50 of 4-3 - Title: Test 50 - testing 
07-23 22:59:14.910: D/drp(19104): removing : 49 of 4-2 - Title: Test 49 - testing 
07-23 22:59:14.910: D/drp(19104): removing : 48 of 4-1 - Title: Test 48 - testing 

Anche in questo caso se io commento la "mMyListViewAdapter.remove (voce);" linea in MainActivity non si blocca e il log sembra indicare che funziona come previsto. Qualcuno può vedere il mio errore che si traduce nell'eccezione del mio indice fuori dai limiti?

Anche io sto usando SDK 4.0.4 API 15.

Molte grazie,

Paul.

Addizione - uscita log completo

 07-25 00:21:53.235: D/AbsListView(25952): Get MotionRecognitionManager 
     07-25 00:21:53.270: D/dalvikvm(25952): GC_CONCURRENT freed 89K, 3% free 13027K/13383K, paused 1ms+2ms 
     07-25 00:21:53.430: D/dalvikvm(25952): GC_CONCURRENT freed 207K, 4% free 13232K/13703K, paused 3ms+2ms 
     07-25 00:21:53.630: D/CLIPBOARD(25952): Hide Clipboard dialog at Starting input: finished by someone else... ! 
     07-25 00:21:54.930: D/dalvikvm(25952): GC_FOR_ALLOC freed 189K, 4% free 13331K/13767K, paused 10ms 
     07-25 00:21:54.930: I/dalvikvm-heap(25952): Grow heap (frag case) to 13.610MB for 408976-byte allocation 
     07-25 00:21:54.940: D/dalvikvm(25952): GC_FOR_ALLOC freed 6K, 4% free 13724K/14215K, paused 9ms 
     07-25 00:21:54.950: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 13724K/14215K, paused 9ms 
     07-25 00:21:54.950: I/dalvikvm-heap(25952): Grow heap (frag case) to 13.994MB for 408976-byte allocation 
     07-25 00:21:54.960: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14124K/14663K, paused 9ms 
     07-25 00:21:54.970: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14124K/14663K, paused 9ms 
     07-25 00:21:54.975: I/dalvikvm-heap(25952): Grow heap (frag case) to 14.384MB for 408976-byte allocation 
     07-25 00:21:54.995: D/dalvikvm(25952): GC_CONCURRENT freed 0K, 4% free 14523K/15111K, paused 1ms+1ms 
     07-25 00:21:55.005: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14523K/15111K, paused 9ms 
     07-25 00:21:55.005: I/dalvikvm-heap(25952): Grow heap (frag case) to 14.774MB for 408976-byte allocation 
     07-25 00:21:55.020: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 14923K/15559K, paused 9ms 
     07-25 00:21:55.030: D/dalvikvm(25952): GC_FOR_ALLOC freed <1K, 5% free 14923K/15559K, paused 9ms 
     07-25 00:21:55.030: I/dalvikvm-heap(25952): Grow heap (frag case) to 15.165MB for 408976-byte allocation 
     07-25 00:21:55.040: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 15322K/16007K, paused 10ms 
     07-25 00:21:55.055: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 15722K/16455K, paused 9ms 
     07-25 00:21:55.110: D/dalvikvm(25952): GC_FOR_ALLOC freed 157K, 5% free 16145K/16903K, paused 9ms 
     07-25 00:21:56.565: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:21:56.690: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:21:56.710: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:22:00.545: D/drp(25952): Adapter Count is: 51 
     07-25 00:22:00.545: D/drp(25952): removing : 49 of 2-2 - Title: Test 49 - testing 
     07-25 00:22:00.545: D/drp(25952): removing : 48 of 2-1 - Title: Test 48 - testing 
     07-25 00:22:00.545: D/drp(25952): removing : 47 of 2-0 - Title: Test 47 - testing 
     07-25 00:22:00.550: D/AndroidRuntime(25952): Shutting down VM 
     07-25 00:22:00.550: W/dalvikvm(25952): threadid=1: thread exiting with uncaught exception (group=0x40c6f1f8) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): FATAL EXCEPTION: main 
     07-25 00:22:00.560: E/AndroidRuntime(25952): java.lang.IndexOutOfBoundsException: Invalid index 48, size is 48 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.util.ArrayList.get(ArrayList.java:304) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at au.drp.mylistview.MyListViewAdapter.getItemId(MyListViewAdapter.java:107) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.confirmCheckedPositionsById(AbsListView.java:5956) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.handleDataChanged(AbsListView.java:5999) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.ListView.layoutChildren(ListView.java:1535) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.onLayout(AbsListView.java:2254) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.onLayout(LinearLayout.java:1415) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1721) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2678) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.os.Handler.dispatchMessage(Handler.java:99) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.os.Looper.loop(Looper.java:137) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.app.ActivityThread.main(ActivityThread.java:4514) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.lang.reflect.Method.invokeNative(Native Method) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.lang.reflect.Method.invoke(Method.java:511) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
+0

seguire questo tutorial può aiutare http://www.quicktips.in/how-to-create-multi-select-listview-android-with -adattatore personalizzato/ –

+0

Grazie per selectionMode = lv.getChoiceMode(). Ho cercato questo. – CoolMind

risposta

0

Edit come:

for (int i = checkedItemsCount-1; i >= 0 ; i--) { 
              ^^^^^ 

invece di

for (int i = checkedItemsCount-1; i >= 0 ; --i) { 
+0

Grazie per il suggerimento, ma sfortunatamente ho ancora la stessa eccezione Eccezione al di fuori del limite. Qualche altro suggerimento? – luthepa1

+0

Posta l'intero errore di visualizzazione di Log-Cat. –

+0

l'output del registro ok aggiunto alla fine del primo messaggio. Grazie. – luthepa1

2

Ok ho risolto il problema !!! SÌÌ!

Quello che dovevo fare per prevenire l'eccezione di IndexOutOFBounds era di resettare l'adattatore di visualizzazione elenco in modo da aggiornare il contenuto della vista elenco. Così la linea di magia era

listView.setAdapter(mMyListViewAdapter); 

Tuttavia credo che questo non è la pratica migliore da utilizzare quando si lavora con una visualizzazione elenco e la sua migliore per aggiornare il contenuto della scheda che la vista lista è collegata. Ma non sono abbastanza sicuro di come farlo?

In ogni caso, è il mio codice di metodo aggiornato rimosso.

private void removeItems() { 
    final SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 

    if (checkedItems != null) { 
     final int checkedItemsCount = checkedItems.size(); 

     // Lets get the position of the view to scroll to before the first checked 
     // item to restore scroll position 
     //   
     int topPosition = checkedItems.keyAt(0) - 1;    

     listView.setAdapter(null); 
     for (int i = checkedItemsCount - 1; i >= 0 ; i--) { 
      // This tells us the item position we are looking at 
      // -- 
      final int position = checkedItems.keyAt(i); 

      // This tells us the item status at the above position 
      // -- 
      final boolean isChecked = checkedItems.valueAt(i); 
      if (isChecked) { 
       Item item = mMyListViewAdapter.getItem(position); 
       mMyListViewAdapter.remove(item); 
       //mMyListViewAdapter.notifyDataSetChanged(); 

      }    
     } 
     listView.setAdapter(mMyListViewAdapter); 
     //if topPosition is -1 then item zero is positioned by default. 
     listView.setSelection(topPosition); 
    } 
} 
2

Sembra che ci sia un errore in AbsListView che causa questo problema. Può accadere con qualsiasi sottoclasse di AbsListView, tra cui ListView e GridView.

In modalità singola e multipla, il ListView risponde ad una chiamata notifyDataSetChanged() il proprio adattatore verificando l'insieme di elementi selezionati in confirmCheckedPositionsById(). Poiché gli elementi selezionati sono già stati eliminati dal set di dati in quel punto, l'adattatore genererà un'eccezione. In particolare, questo problema si verifica solo se il metodo hasStableIds() della scheda restituisce true.

In parole povere, questo è il percorso relativo:

  1. Si selezionano uno o più elementi in ListView
  2. Il ListView aggiorna il suo elenco di elementi selezionati
  3. si fa clic sul pulsante Elimina
  4. Gli articoli vengono rimossi dal set di dati
  5. Si chiama notifyDataSetChanged() sull'adattatore e notifica agli osservatori che il set di dati è stato modificato. Lo ListView è uno di quegli osservatori.
  6. La prossima volta che lo ListView viene ridisegnato, visualizza la notifica dell'adattatore e chiama handleDataChanged(). A questo punto, il ListView pensa ancora che i nostri articoli ora cancellati siano selezionati e nel dataset.
  7. Il metodo handleDataChanged() chiama confirmCheckedPositionsById(), che a sua volta tenta di chiamare getItemId() sull'adattatore utilizzando una posizione obsoleta. Se l'elemento eliminato si trova vicino alla fine dell'elenco, è probabile che questa posizione sia fuori limite per l'array e l'adattatore genererà IndexOutOfBoundsException.

due possibili soluzioni sono i seguenti:

  • Creare un nuovo adattatore ogni volta che cambia il set di dati, come già sottolineato in altre risposte. Questo ha lo sfortunato effetto di perdere la posizione di scorrimento corrente a meno che non venga salvata e ripristinata manualmente.

  • Cancella gli elementi selezionati chiamando clearChoices() sul ListView (o GridView) prima di chiamare notifyDataSetChanged() sull'adattatore. Gli elementi selezionati verranno comunque eliminati, quindi è improbabile che perdere lo stato di selezione corrente sia un problema. Questo metodo manterrà la posizione di scorrimento e dovrebbe impedire lo sfarfallio durante l'aggiornamento dell'elenco.

+0

acj, sei corretto se c'è un errore quando confirmCheckPositionsByid() viene chiamato su una posizione obsoleta. Tuttavia, ho scoperto che se chiamo clearChoices(), la fine di ActionMode # non riesce ad uscire dalla modalità di selezione multipla. –

+0

@PeterTran Interessante. Chiamare 'clearChoices()' e poi 'ActionMode # finish()' per uscire dalla modalità di selezione multipla ha funzionato per me. (Il mio lavoro è stato su 4.0+.) Si prega di postare di nuovo se trovate una soluzione alternativa. – acj

+0

clearChoices !!! È OK !!! MA DONNOT DIMENTICA setChoiceMode (ListView.CHOICE_MODE_MULTIPLE); SEGUI! – YETI

2

Il bug in confirmCheckedPositionsById (proiettile # 7 nella risposta di ACJ) fa sì che getItemId ottenere chiamato su una posizione stantio. Tuttavia, verrà richiamato di nuovo con la posizione corretta per aggiornare il layout.Quando mi sono imbattuto in questo problema ho aggiornato l'adattatore del getItemId in questo modo

@Override 
public long getItemId(int position) { 
    return position < getCount() ? getItem(position).getId() : -1; 
} 
+0

Grazie, funziona per me! Non lo so, ma abbiamo 2015 e c'è ancora il bug in 'confirmCheckedPositionsById'. – Aitch

0

Questa usanza è un bug documentato, si prega di votare per esso:

https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=64596

mio caso d'uso è la ListView configurato come ListView .CHOICE_MODE_SINGLE, ho provato il suggerimento di @Peter Tran senza fortuna. Ecco la soluzione che è successo per me:

myAdapter.deleteRow(listView.getCheckedItemPosition()); 
    int checkedIndex = listView.getCheckedItemPosition(); 
    System.out.println("checkedIndex="+checkedIndex); 

    int count=myAdapter.getCount(); 
    if (checkedIndex==count) listView.setItemChecked(count-1, true); 

Il mio test è quello di selezionare manualmente l'ultimo elemento della lista (count-1). Ho omesso la gestione per count == 0 case ma probabilmente sarà necessario. Ho notato che println() stampa sempre l'indice della riga cancellata. myAdapter.deleteRow() notifica la modifica dei dati agli ascoltatori che mi dice che ListView non aggiorna correttamente gli indici controllati. Ho provato questo codice con hasStableIds() restituendo sia true che false dall'adattatore personalizzato con gli stessi risultati.

0

Filtro utilizzando AlertDialog.Builder completamente personalizzato: -

((TextView) TabBarWithCustomStack.vPublic.findViewById(R.id.tv_edit)) .setVisibility(View.GONE); 
    class DialogSelectionClickHandler implements 
      DialogInterface.OnMultiChoiceClickListener { 
     public void onClick(DialogInterface dialog, int clicked, 
       boolean selected) { 
      Log.i("ME", hosts.toArray()[clicked] + " selected: " + selected); 
     } 
    } 

    class DialogButtonClickHandler implements 
      DialogInterface.OnClickListener { 
     public void onClick(DialogInterface dialog, int clicked) { 
      switch (clicked) { 
      case DialogInterface.BUTTON_POSITIVE: 
       filteredList.clear(); 
       statusesSelected.clear(); 

       for (int i = 0; i < statusesStringArray.length; i++) { 
        // Log.i("ME", statuses.toArray()[ i ] + " selected: " 
        // + isSelectedStatuses[i]); 

        if (isSelectedStatuses[i] == true) { 

         if (statuses.get(i).toString() 
           .equalsIgnoreCase("Accepted")) { 
          statusesSelected.add("1"); 
         } else if (statuses.get(i).toString() 
           .equalsIgnoreCase("Rejected")) { 
          statusesSelected.add("2"); 
         } else if (statuses.get(i).toString() 
           .equalsIgnoreCase("Pending")) { 
          statusesSelected.add("3"); 
         } 

        } 
        isSelectedStatuses[i] = false; 
       } 

       Calendar currentCalender = Calendar.getInstance(Locale 
         .getDefault()); 

       Date currentDate = new Date(
         currentCalender.getTimeInMillis()); 

       if (listSelected == 0) { 
        for (int j = 0; j < arr_BLID.size(); j++) { 
         if (Helper.stringToDate(
           arr_BLID.get(j).getStart_ts().toString(), 
           Helper.SERVER_FORMAT).after(currentDate)) { 
          if (statusesSelected.contains(arr_BLID.get(j) 
            .getStatus())) { 
           filteredList.add(arr_BLID.get(j)); 
          } 
         } 
        } 

       } else { 
        for (int j = 0; j < arr_BLID.size(); j++) { 
         if (currentDate.after(Helper.stringToDate(arr_BLID 
           .get(j).getStart_ts().toString(), 
           Helper.SERVER_FORMAT))) { 
          if (statusesSelected.contains(arr_BLID.get(j) 
            .getStatus())) { 
           filteredList.add(arr_BLID.get(j)); 
          } 
         } 
        } 

       } 

       lvBeeps.setAdapter(new EventsAdapter(ctx)); 

       break; 

      case DialogInterface.BUTTON_NEGATIVE: { 

       currentCalender = Calendar.getInstance(Locale.getDefault()); 

       currentDate = new Date(currentCalender.getTimeInMillis()); 

       if (listSelected == 0) { 

        filteredList.clear(); 
        for (int i = 0; i < arr_BLID.size(); i++) { 
         if (Helper.stringToDate(
           arr_BLID.get(i).getStart_ts().toString(), 
           Helper.SERVER_FORMAT).after(currentDate)) { 
          filteredList.add(arr_BLID.get(i)); 
         } 

         if (i < isSelectedStatuses.length) { 
          isSelectedStatuses[i] = false; 
         } else { 
          continue; 
         } 
        } 

        lvBeeps.setAdapter(new EventsAdapter(ctx)); 
       } else { 

        filteredList.clear(); 
        for (int i = 0; i < arr_BLID.size(); i++) { 
         if (currentDate.after(Helper.stringToDate(arr_BLID 
           .get(i).getStart_ts().toString(), 
           Helper.SERVER_FORMAT))) { 
          filteredList.add(arr_BLID.get(i)); 
         } 

         if (i < isSelectedStatuses.length) { 
          isSelectedStatuses[i] = false; 
         } else { 
          continue; 
         } 

        } 

        lvBeeps.setAdapter(new EventsAdapter(ctx)); 

       } 
      } 
       break; 
      } 
     } 
    } 

    btnHost = (Button) view.findViewById(R.id.btnHost); 
    btnHost.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      // ((TextView)((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.tvDialogTitle)).setText("Hosts"); 

      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((TextView)((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.tvDialogTitle)).getText()); 

      final LayoutInflater inflater123 = (LayoutInflater) getActivity() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      final View view123 = inflater123.inflate(
        R.layout.event_filter_title, null); 

      // Log.d("Dialog object", 
      // " static made dialog in view123--> "+view123); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)view123.findViewById(R.id.cbSelectAll))); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)inflater.inflate(R.layout.event_filter_title, 
      // (ViewGroup) ((AlertDialog) 
      // BeepsFragment.dialog).getCurrentFocus(), 
      // true).findViewById(R.id.cbSelectAll))); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)(((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.cbSelectAll)))); 
      hostsDialog = new AlertDialog.Builder(getActivity()) 
        .setCustomTitle(/* 
            * Html.fromHtml(
            * "<b><font color=\"purple\"> Host</font></b>" 
            *) 
            */view123) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setMultiChoiceItems(hostsStringArray, isSelectedHosts, 
          new OnMultiChoiceClickListener() { 

           // android.content.DialogInterface.OnShowListener 
           // ocl = new 
           // DialogInterface.OnShowListener() { 
           // 
           // @Override 
           // public void onShow(DialogInterface 
           // dialog) { 
           // // TODO Auto-generated method stub 
           // BeepsFragment.dialog = dialog; 
           // } 
           // }; 

           public void onClick(DialogInterface dialog, 
             int clicked, boolean selected) { 

            boolean all = true; 
            Log.i("ME", hosts.toArray()[clicked] 
              + " selected: " + selected); 

            // for (int i = 0; i < 
            // isSelectedHosts.length; i++){ 
            // 
            // if(isSelectedHosts[i]==true){ 
            // all = true; 
            // }else{ 
            // all = false; 
            // } 
            // } 
            // 
            // Log.i("ME", all + " selected:--- " 
            // +((CheckBox)view123.findViewById(R.id.cbSelectAll))); 
            // 
            // if(all = true){ 
            // ((CheckBox)view123.findViewById(R.id.cbSelectAll)).setChecked(true); 
            // }else{ 
            // ((CheckBox)view123.findViewById(R.id.cbSelectAll)).setChecked(false); 
            // } 

            Log.d("Dialog object", 
              " static made dialog --> " 
                + BeepsFragment.dialog 
                + " from parameter dialog --> " 
                + dialog); 

           } 

          }) 
        .setPositiveButton(
          Html.fromHtml("<b><font color=\"purple\">Apply Filter</font></b>"), 
          new DialogButtonClickHandler() { 

           // android.content.DialogInterface.OnShowListener 
           // ocl = new 
           // DialogInterface.OnShowListener() { 
           // 
           // @Override 
           // public void onShow(DialogInterface 
           // dialog) { 
           // // TODO Auto-generated method stub 
           // BeepsFragment.dialog = dialog; 
           // } 
           // }; 

           public void onClick(DialogInterface dialog, 
             int clicked) { 
            switch (clicked) { 
            case DialogInterface.BUTTON_POSITIVE: 

             filteredList.clear(); 
             hostsSelected.clear(); 

             for (int i = 0; i < hostsStringArray.length; i++) { 
              Log.i("ME", 
                hosts.toArray()[i] 
                  + " selected: " 
                  + isSelectedHosts[i] 
                  + "\n\n\t hostStringArray-->" 
                  + hostsStringArray[i]); 

              if (isSelectedHosts[i] == true) { 

               hostsSelected.add(hosts 
                 .get(i)); 
               isSelectedHosts[i] = false; 
              } 
              // isSelectedHosts[i] = false; 
             } 

             Calendar currentCalender = Calendar 
               .getInstance(Locale 
                 .getDefault()); 

             Date currentDate = new Date(
               currentCalender 
                 .getTimeInMillis()); 

             if (listSelected == 0) { 
              for (int j = 0; j < arr_BLID 
                .size(); j++) { 
               if (Helper 
                 .stringToDate(
                   arr_BLID.get(
                     j) 
                     .getStart_ts() 
                     .toString(), 
                   Helper.SERVER_FORMAT) 
                 .after(currentDate)) { 
                if (hostsSelected 
                  .contains(arr_BLID 
                    .get(j) 
                    .getHost_name())) { 
                 filteredList 
                   .add(arr_BLID 
                     .get(j)); 
                } 
                if (hostsSelected 
                  .contains("Me")) 
                 if (BeepApplication 
                   .getSelfId() == arr_BLID 
                   .get(j) 
                   .getHost_id()) 
                  filteredList 
                    .add(arr_BLID 
                      .get(j)); 
               } 
              } 

             } else { 
              for (int j = 0; j < arr_BLID 
                .size(); j++) { 
               if (currentDate.after(Helper 
                 .stringToDate(
                   arr_BLID.get(
                     j) 
                     .getStart_ts() 
                     .toString(), 
                   Helper.SERVER_FORMAT))) { 
                if (hostsSelected 
                  .contains(arr_BLID 
                    .get(j) 
                    .getHost_name())) { 
                 filteredList 
                   .add(arr_BLID 
                     .get(j)); 
                } 
                if (hostsSelected 
                  .contains("Me")) 
                 if (BeepApplication 
                   .getSelfId() == arr_BLID 
                   .get(j) 
                   .getHost_id()) 
                  filteredList 
                    .add(arr_BLID 
                      .get(j)); 
               } 
              } 

             } 
             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 
             break; 
            } 
           } 

          }) 
        .setNegativeButton(
          Html.fromHtml("<b><font color=\"purple\">Remove Filter</font></b>"), 
          new DialogButtonClickHandler() { 

           public void onClick(
             final DialogInterface dialog, 
             int clicked) { 

            Calendar currentCalender = Calendar 
              .getInstance(Locale 
                .getDefault()); 

            Date currentDate = new Date(
              currentCalender 
                .getTimeInMillis()); 

            if (listSelected == 0) { 

             filteredList.clear(); 
             for (int i = 0; i < arr_BLID.size(); i++) { 
              if (Helper.stringToDate(
                arr_BLID.get(i) 
                  .getStart_ts() 
                  .toString(), 
                Helper.SERVER_FORMAT) 
                .after(currentDate)) { 
               filteredList.add(arr_BLID 
                 .get(i)); 
               if (i < isSelectedHosts.length) { 
                isSelectedHosts[i] = false; 
               } else { 
                continue; 
               } 
              } 
             } 

             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 
            } else { 

             filteredList.clear(); 
             for (int i = 0; i < arr_BLID.size(); i++) { 
              if (currentDate.after(Helper 
                .stringToDate(
                  arr_BLID.get(i) 
                    .getStart_ts() 
                    .toString(), 
                  Helper.SERVER_FORMAT))) { 
               filteredList.add(arr_BLID 
                 .get(i)); 
               if (i < isSelectedHosts.length) { 
                isSelectedHosts[i] = false; 
               } else { 
                continue; 
               } 
              } 
             } 

             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 

            } 
           } 
          }); 

      final AlertDialog dlg = hostsDialog.create(); 

      dlg.show(); 

      ((TextView) view123.findViewById(R.id.tvDialogTitle)) 
        .setText("Hosts"); 

      ((CheckBox) view123.findViewById(R.id.cbSelectAll)) 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(
           CompoundButton buttonView, boolean isChecked) { 
          // TODO Auto-generated method stub 

          if (isChecked == true) { 

           ListView list = dlg.getListView(); 
           for (int i = 0; i < list.getCount(); i++) { 

            isSelectedHosts[i] = true; 
            list.setItemChecked(i, true); 

           } 

          } 

          else if (isChecked == false) { 

           ListView list = dlg.getListView(); 
           for (int j = 0; j < list.getCount(); j++) { 

            isSelectedHosts[j] = false; 
            list.setItemChecked(j, false); 
           } 
           // } 
          } 

         } 
        }); 

     } 
    }); 

    btnStatus = (Button) view.findViewById(R.id.btnStatus); 
    btnStatus.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      LayoutInflater inflater123 = (LayoutInflater) getActivity() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View view123 = inflater123.inflate(R.layout.event_filter_title, 
        null); 

      statusDialog = new AlertDialog.Builder(getActivity()) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setCustomTitle(/* 
            * Html.fromHtml(
            * "<b><font color=\"purple\"> Status</font></b>" 
            *) 
            */view123) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setMultiChoiceItems(statusesStringArray, 
          isSelectedStatuses, 
          new DialogSelectionClickHandler()) 
        .setPositiveButton(
          Html.fromHtml("<b><font color=\"purple\">Apply Filter</font></b>"), 
          new DialogButtonClickHandler() { 

          }) 
        .setNegativeButton(
          Html.fromHtml("<b><font color=\"purple\">Remove Filter</font></b>"), 
          new DialogButtonClickHandler()); 

      final AlertDialog dlg = statusDialog.create(); 

      dlg.show(); 

      ((TextView) view123.findViewById(R.id.tvDialogTitle)) 
        .setText("Status"); 
      ((CheckBox) view123.findViewById(R.id.cbSelectAll)) 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(
           CompoundButton buttonView, boolean isChecked) { 
          // TODO Auto-generated method stub 

          if (isChecked == true) { 

           ListView list = dlg.getListView(); 
           for (int i = 0; i < list.getCount(); i++) { 

            isSelectedStatuses[i] = true; 
            list.setItemChecked(i, true); 

           } 

          } 

          else if (isChecked == false) { 

           ListView list = dlg.getListView(); 
           for (int j = 0; j < list.getCount(); j++) { 

            isSelectedStatuses[j] = false; 
            list.setItemChecked(j, false); 
           } 
           // } 
          } 

         } 
        }); 

     } 
    }); 
Problemi correlati