2012-07-23 7 views
5

Mam niestandardowy widok listy przy użyciu klasy adaptera, aby rozszerzyć ArrayAdapter klasy Item. Mam możliwość zmiany między trybami wyboru BRAK, Pojedynczy i Multi. Wszystko działa dobrze. Teraz próbuję zaimplementować metodę usuwania elementów z widoku listy (i adaptera) z wielokrotnym wyborem w trybie wyboru wielokrotnego. Jednak otrzymuję wyjątki IndexOutOFBounds, wykonując jedną z następujących czynności; 1) usuń ostatnią pozycję w widoku listy w trybie POJEDYNCZYM wyborem (Uwaga: wszystko przed usunięciem ostatniej pozycji) 2) W trybie wyboru wielokrotnego wyboru ponownie nie mogę usunąć ostatniego elementu 3) ponownie w trybie wyboru wielokrotnego Mogę usunąć pojedynczy wybrane elementy przed ostatnią pozycją, ale 2 lub więcej selekcji powoduje ponowne wyświetlenie indeksu z błędów obwiedni.Android - niestandardowy adapter ListView - usunięcie wielu elementów - Indexoutofbounds - dlaczego?

Dodałem dziennik debugowania, aby wyświetlić pozycję, która została usunięta, oraz rozmiar getCheckItemPositions() i mój licznik pętli for (np. I), a na końcu tytuł pozycji usuniętego elementu. Jeśli skomentuję rzeczywistą linię listadpter.remove (pozycja), to wynik logu wydaje się wskazywać, że wszystko działa poprawnie Więc podejrzewam, że problem ten wpada w moją metodę getView klasy adaptera. Ale mój mózg jest wyczerpany i utknąłem.

MainActivity.class - metoda removeItems wywoływana z obiektu widoku przycisku;

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

      } 
     } 
    } 
} 

Klasa adaptera;

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

Klasy towarów - pierwsza połowa;

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

Oto wizualny śledzenia moich debug log przeprowadzek poz

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 

ponownie, jeśli I ustosunkowania się "mMyListViewAdapter.remove (przedmiot);" linia w MainActivity nie zawiesza się, a log wydaje się wskazywać, że działa zgodnie z oczekiwaniami. Czy ktoś może zobaczyć mój błąd, który powoduje wyjątek Out of Bounds?

Również używam SDK 4.0.4 API 15.

Wielkie dzięki,

Pawła.

Dodawanie - pełna moc dziennika

 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

śledzić ten poradnik może pomóc http://www.quicktips.in/how-to-create-multi-select-listview-android-with -custom-adapter/ –

+0

Dziękujemy za selectionMode = lv.getChoiceMode(). Szukałem tego. – CoolMind

Odpowiedz

0

Edit jako:

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

insted

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

Dzięki za sugestię, ale niestety nadal mam ten sam wyjątek Index Out Of Bounds. Jakieś inne sugestie? – luthepa1

+0

Po wyświetleniu całego błędu Log-Cat wyświetlany jest błąd. –

+0

wydruk ok log został dodany do końca pierwszego wpisu. dzięki. – luthepa1

2

Ok I rozwiązać problem !!! YAY!

Co musiałem zrobić, aby zapobiec wyjątkowi IndexOutOFBounds było zresetować adapter widoku listy, aby odświeżyć zawartość widoku listy. Tak magiczna linia była

listView.setAdapter(mMyListViewAdapter); 

Jednak wierzę, że to nie jest najlepszą praktyką jest stosowanie podczas pracy z widoku listy i że lepiej, aby aktualizować zawartość karty, że widok jest dołączony do listy. Ale nie jestem do końca pewien, jak to osiągnąć?

W każdym razie jest to mój zaktualizowany kod metody usuwania.

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

Wygląda na to, że występuje błąd w AbsListView, który powoduje ten problem. Może się zdarzyć z każdą podklasą AbsListView, w tym ListView i GridView.

W trybie jedno i wielodostępowym urządzenie ListView reaguje na wywołanie notifyDataSetChanged() na jego przejściówkę, sprawdzając zestaw zaznaczonych elementów w postaci confirmCheckedPositionsById(). Ponieważ wybrany element (elementy) został już usunięty z zestawu danych w tym momencie, adapter wygeneruje wyjątek. Warto zauważyć, że ten problem występuje tylko wtedy, gdy metoda adaptera hasStableIds() zwraca true.

Luźno rzecz biorąc, jest to odpowiednia droga:

  1. wybrać jeden lub więcej elementów w ListView
  2. ListView aktualizuje swoją listę wybranych przedmiotów
  3. kliknąć przycisk Usuń
  4. Element (y) są usuwane z zestawu danych
  5. Wywołujesz notifyDataSetChanged() na swoim adapterze i powiadamia on swoich obserwatorów, że zestaw danych się zmienił. Jednym z tych obserwatorów jest ListView.
  6. Następnym razem, gdy ListView zostanie przerysowany, widzi powiadomienie adaptera i wywołuje handleDataChanged(). W tym momencie model ListView nadal uważa, że ​​nasze obecnie usunięte elementy zostały wybrane jako oraz w zestawie danych.
  7. Metoda handleDataChanged() wywołuje confirmCheckedPositionsById(), która z kolei próbuje wywołać getItemId() na adapterze za pomocą nieaktualnej pozycji. Jeśli usunięty element znajduje się blisko końca listy, pozycja ta prawdopodobnie będzie poza obszarem tablicy, a adapter wyrzuci IndexOutOfBoundsException.

Dwa możliwe obejścia są następujące:

  • Tworzenie nowej karty za każdym razem zmienia zbioru danych, jak zauważono w innych odpowiedzi. Ma to niefortunny wpływ na utratę aktualnej pozycji przewijania, chyba że zostanie zapisane i przywrócone ręcznie.

  • Usuń wybrane elementy dzwoniąc clearChoices() na ListView (lub GridView) przed wywołaniem notifyDataSetChanged() na adapterze. Wybrane elementy zostaną usunięte, więc utrata obecnego stanu selekcji nie będzie stanowić problemu. Ta metoda zachowa pozycję przewijania i powinna zapobiegać migotaniu podczas aktualizacji listy.

+0

acj, masz rację, jest błąd, gdy funkcja confirmCheckPositionsByid() jest wywoływana na nieaktualnej pozycji. Jednakże, stwierdziłem, że jeśli wywołasz clearChoices(), to zakończenie ActionMode # kończy się niepowodzeniem, aby wyjść z trybu wielokrotnego wyboru. –

+0

@PeterTran Interesujące. Wywołanie funkcji 'clearChoices()', a następnie 'ActionMode # finish()', aby wyjść z trybu wielokrotnego wyboru, zadziałało właśnie dla mnie. (Moja praca była w wersji 4.0+). Proszę napisać ponownie, jeśli znajdziesz obejście. – acj

+0

clearChoices !!! TO OK !!! BUT DONNOT FORGET setChoiceMode (ListView.CHOICE_MODE_MULTIPLE); Śledź! – YETI

2

Błąd w confirmCheckedPositionsById (kula nr 7 w odpowiedzi na ACJ) powoduje getItemId aby wezwał nieświeży pozycji. Zostanie jednak wywołany ponownie z poprawną pozycją, aby odświeżyć układ.Kiedy wpadłem na ten problem zaktualizowałem zwyczaj adaptera getItemId jak tak

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

Dzięki, to działa dla mnie! Nie wiem, ale mamy 2015 i wciąż jest błąd w 'confirmCheckedPositionsById'. – Aitch

0

Jest to udokumentowane bug, proszę głosować na niego:

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

Moje przypadek użycia jest ListView skonfigurowany jako ListView .CHOICE_MODE_SINGLE Próbowałem sugestii @Peter Tran bez żadnego szczęścia. Oto obejście, które jest skuteczne dla mnie:

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

Mój test jest ręcznie wybrać ostatnią pozycję na liście (count-1). Pominąłem obsługę dla count == 0 case, ale najprawdopodobniej będzie to potrzebne. Zauważyłem, że println() zawsze drukuje indeks usuniętego wiersza. myAdapter.deleteRow() powiadamia o zmianie danych na detektory, które mówią mi, że ListView nie aktualizuje poprawnie sprawdzonych indeksów. Próbowałem tego kodu z hasStableIds() zwracając zarówno true i false z niestandardowego adaptera z tymi samymi wynikami.

0

filtra za pomocą AlertDialog.Builder pełni dostosowane: -

((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); 
           } 
           // } 
          } 

         } 
        }); 

     } 
    });