【问题标题】:Android - Custom ListView Adapter - Multi Selection remove - Indexoutofbounds - why?Android - 自定义 ListView 适配器 - 多选删除 - Indexoutofbounds - 为什么?
【发布时间】:2012-07-23 13:29:01
【问题描述】:

我有一个自定义 Listview,它使用适配器类来扩展 Item 类的 ArrayAdapter。我有能力在 NONE、Single 和 Multi 的选择模式之间进行切换。这一切都很好。我现在要实现的是一种在多选模式下通过多项选择从列表视图(和适配器)中删除项目的方法。但是,在执行以下任一操作时,我会收到 IndexOutOFBounds 异常; 1)在单选模式下删除列表视图中的最后一项(注意:最后一项之前的任何内容都可以删除) 2)在多选模式下,我再次无法删除最后一项 3) 再次在多选模式下,我可以在最后一个项目之前删除单个选定的项目,但是 2 个或更多选择会再次导致索引超出范围错误。

我添加了调试日志以显示被删除的位置和 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);

            }
        }
    }
}

适配器类;

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

还有物品类——前半部分;

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(item);” 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)

【问题讨论】:

  • 跟着这个教程可能对你有帮助quicktips.in/…
  • 感谢 selectionMode = lv.getChoiceMode()。我找了这个。

标签: android listview android-arrayadapter


【解决方案1】:

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() 之前,通过调用ListView(或GridView)上的clearChoices() 来清除所选项目。无论如何都会删除所选项目,因此丢失当前选择状态不太可能成为问题。此方法将保留滚动位置,并应防止在更新列表时闪烁。

【讨论】:

  • acj,你是对的,当在陈旧的位置上调用 confirmCheckPositionsByid() 时存在错误。但是,我发现如果我调用 clearChoices() 则 ActionMode#finish 无法退出多选模式。
  • @PeterTran 有趣。调用clearChoices() 然后ActionMode#finish() 退出多选模式对我有用。 (我的工作一直在 4.0+ 上。)如果您找到解决方法,请再次发布。
  • clearChoices!!!没问题!!!但不要忘记 setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);FOLLOW!
【解决方案2】:

confirmCheckedPositionsById 中的错误(acj 的回答中的第 7 条)导致getItemId 在陈旧的位置上被调用。但是,它将以正确的位置再次调用以刷新布局。当我遇到这个问题时,我像这样更新了自定义适配器的getItemId

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

【讨论】:

  • 谢谢,这对我有用!我不知道,但我们有 2015 年,confirmCheckedPositionsById 中仍然存在错误。
  • 嗨,2015!现在是 2021 年,我仍然面临同样的错误:@
【解决方案3】:

好的,我解决了这个问题!!!耶!

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

 listView.setAdapter(mMyListViewAdapter);

但是我认为这不是使用列表视图时使用的最佳做法,最好更新列表视图所附加到的适配器的内容。但我不太确定该怎么做?

反正他是我更新的remove方法代码。

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

【讨论】:

    【解决方案4】:

    这是一个记录在案的错误,请投票:

    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.CHOICE_MODE_SINGLE 的 ListView,我尝试了 @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);
    

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

    【讨论】:

    • 不幸的是,错误票已关闭,因为它在没有任何 Google 关注的情况下打开时间过长 :( 否则我会投票支持它。现在是 2021 年,我仍然面临这个问题 :(
    【解决方案5】:

    使用完全自定义的 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);
                                    }
                                    // }
                                }
    
                            }
                        });
    
            }
        });
    

    【讨论】:

      【解决方案6】:

      编辑为:

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

      安装在

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

      【讨论】:

      • 感谢您的建议,但不幸的是我仍然有相同的索引越界异常。还有其他建议吗?
      • 发布你的整个 Log-Cat 显示错误。
      • 你有 ArrayList.java 文件吗?如果是,该文件第 251 行的代码是什么??
      • 这不是我编码的文件。假设它在编译时从 sdk 链接。我可以在电脑前仔细观察。
      • 这个答案中的代码更改应该没有任何区别。仅当使用 i----i 表达式的值时,前置增量与后置增量才有意义,而当它是 for 循环的第三部分时,则无关紧要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多