2012-07-23 102 views
5

我有一个自定义Listview使用适配器类来扩展ItemAdapter的Item类。我有能力在NONE,Single和Multi的选择模式之间切换。这一切工作正常。我现在想实现的是一种在多选模式下通过多选来从列表视图(和适配器)中删除项目的方法。但是,当我执行以下任一操作时,我会得到IndexOutOFBounds异常; 1)在单选模式下删除列表视图中的最后一项(注意:最后一项删除OK前的任何内容) 2)在多选择选择模式下,我再次无法删除最后一项 3)在多选模式下,我可以删除单个在最后一项之前选择项目但是2个或更多选择导致索引超出界限错误。Android - 自定义ListView适配器 - 多选择删除 - Indexoutofbounds - 为什么?

我添加了调试日志以显示被删除的位置以及getCheckItemPositions()和我的for循环计数器(例如i)的大小,最后是要删除的项目的项目标题。如果我注释掉实际的listadpter.remove(position)行然后日志输出似乎指示所有工作正常所以我现在怀疑问题落入我的适配器类getView方法。但我的大脑已经疲惫不堪,而且我陷入困境。

MainActivity.class - 从按钮视图对象调用的removeItems方法;

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

      } 
     } 
    } 
} 

Adapter Class;

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

and Item Class - first half;

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

这里是我的视觉调试日志跟踪项目清除的

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 

再次,如果我注释掉 “mMyListViewAdapter.remove(项目);”在MainActivity线没有崩溃和日志似乎表明其预计工作。任何人都可以看到我的错误,导致我的索引超出界限例外?

而且我使用SDK 4.0.4 API 15

非常感谢,

保罗。

加法 - 完整的日志输出

 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

按照这个教程可以帮助你http://www.quicktips.in/how-to-create-multi-select-listview-android-with - 自定义适配器/ – 2015-08-25 03:38:11

+0

感谢selectionMode = lv.getChoiceMode()。我寻找这个。 – CoolMind 2016-02-24 10:30:28

回答

0

编辑为:

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

insted的作者

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

感谢您的建议,但不幸的是,我仍然有相同的索引出界异常。还有其他建议吗? – luthepa1 2012-07-23 23:46:23

+0

发布您的整个日志猫显示错误。 – 2012-07-24 08:34:47

+0

确定日志输出添加到第一篇文章的结尾。谢谢。 – luthepa1 2012-07-24 14:30:31

2

好吧,我解决了这个问题!好极了!

我不得不做的,以防止IndexOutOFBounds异常是重置列表视图适配器,以刷新列表视图的内容。所以魔线是

listView.setAdapter(mMyListViewAdapter); 

不过,我相信这不是一个列表视图中工作和更好的更新列表视图连接到适配器的内容时​​所使用的最佳实践。但我不太清楚如何去做?

无论如何,他是我更新的删除方法代码。

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

AbsListView似乎存在导致此问题的错误。它可以发生在AbsListView的任何子类别中,包括ListViewGridView

在单选和多选模式下,ListView通过验证confirmCheckedPositionsById()中的一组检查项来响应其适配器上的notifyDataSetChanged()调用。由于选定的项目在该点已经从数据集中删除,适配器将抛出异常。值得注意的是,只有在适配器的hasStableIds()方法返回true时才会出现此问题。

宽泛地说,这是相关的路径:

  1. 您选择ListView中的一个或多个项目
  2. ListView更新其选择的产品清单
  3. 您点击删除按钮
  4. 该项目已从您的数据集中删除
  5. 您在适配器上调用notifyDataSetChanged(),并通知其观察者数据集已更改。 ListView是其中的一个观察员。
  6. 下一次ListView重新绘制时,它会看到适配器的通知并调用handleDataChanged()。在这一点上,ListView仍然认为我们现在删除的项目被选中和数据集
  7. handleDataChanged()方法调用confirmCheckedPositionsById(),后者又尝试使用陈旧位置在适配器上调用getItemId()。如果删除的项目碰巧接近列表的末尾,则该位置可能超出阵列的范围,并且适配器将抛出IndexOutOfBoundsException

两个可能的解决方法如下:

  • 创建一个新的适配器每次数据集的变化,在其他的答案指出。这有失去当前滚动位置的不幸效果,除非手动保存和恢复。

  • 在调用适配器上的notifyDataSetChanged()之前,请致电(或GridView),致电clearChoices()以清除所选项目。无论如何,所选项目将被删除,因此失去当前选择状态不太可能成为问题。此方法将保留滚动位置,并应防止列表更新时闪烁。

+0

acj,你是正确的,当在陈旧的位置上调用confirmCheckPositionsByid()时有一个错误。但是,我发现如果我调用clearChoices(),则ActionMode#finish无法退出多选模式。 – 2013-03-28 21:43:10

+0

@PeterTran有趣。调用'clearChoices()'然后'ActionMode#finish()'退出多选模式对我很有用。 (我的工作已在4.0+以上。)如果您找到解决方法,请重新发布。 – acj 2013-03-29 16:43:57

+0

clearChoices !!! IS OK !!!但是DONNOT FORGET setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); FOLLOW! – YETI 2015-09-23 09:34:32

2

confirmCheckedPositionsById(子弹#7 ACJ的答案)导致getItemId的错误得到叫上一个陈旧的位置。但是,它会再次调用正确的位置来刷新布局。当我遇到了这个问题,我更新了自定义适配器的getItemId像这样

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

谢谢,这对我很有用!我不知道,但我们有2015年,并且'confirmCheckedPositionsById'仍然存在错误。 – Aitch 2015-03-28 21:23:30

0

这是一个记录的错误,请为它投票:

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

我的使用情况是配置的ListView ListView控件.CHOICE_MODE_SINGLE,我尝试了@Peter Tran的建议,但没有任何运气。下面是成功的,我的解决方法:

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

我的测试是手动选择列表(计数-1)上的最后一个项目。我忽略了count == 0情况下的处理,但这很可能是需要的。我观察到println()总是打印删除行的索引。 myAdapter.deleteRow()将数据更改通知给侦听器,这些侦听器对我说ListView没有正确更新它的检查索引。我已经使用hasStableIds()从具有相同结果的自定义适配器返回true和false的代码。

0

过滤器使用AlertDialog.Builder完全定制: -

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

         } 
        }); 

     } 
    }); 
相关问题