我有一个使用适配器类的自定义Listview来扩展Item类的ArrayAdapter。我可以在NONE,Single和Multi的选择模式之间切换。一切正常。我现在尝试实现的是一种在多选模式下从列表视图(和适配器)中删除多项选项的方法。但是,当执行以下任一操作时,我会获得IndexOutOFBounds Exceptions; 1)在SINGLE选择模式下删除listview中的最后一项(注意:最后一项删除之前的任何内容) 2)在多选择选择模式中,我再次无法删除最后一项 3)再次在多选模式下,我可以在最后一项之前删除单个选定项目,但是两次或多次选择会导致索引超出界限错误。
我添加了调试日志以显示正在删除的位置和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)
答案 0 :(得分:2)
好的,我解决了这个问题! YAY!
我必须做的是防止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);
}
}
答案 1 :(得分:2)
AbsListView
中似乎存在导致此问题的错误。 AbsListView
的任何子类都可能发生这种情况,包括ListView
和GridView
。
在单选和多选模式下,ListView
通过验证notifyDataSetChanged()
中的已检查项集来响应其适配器上的confirmCheckedPositionsById()
调用。由于此时已从数据集中删除了所选项,因此适配器将引发异常。值得注意的是,仅当适配器的hasStableIds()
方法返回true
时才会出现此问题。
松散地说,这是相关的路径:
ListView
更新其所选项目列表notifyDataSetChanged()
,并通知其观察者数据集已更改。 ListView
是其中一位观察员。ListView
时,会看到适配器的通知并调用handleDataChanged()
。此时,ListView
仍然认为我们现在删除的项目已选择并位于数据集中。handleDataChanged()
方法调用confirmCheckedPositionsById()
,后者又尝试使用陈旧位置调用适配器上的getItemId()
。如果删除的项恰好接近列表的末尾,则此位置可能超出数组范围,并且适配器将抛出IndexOutOfBoundsException
。两种可能的解决方法如下:
每次数据集更改时都会创建一个新适配器,如其他答案中所述。除非手动保存和恢复,否则会丢失当前滚动位置,这会产生令人遗憾的效果。
在拨打适配器上的clearChoices()
之前,通过调用ListView
(或GridView
)上的notifyDataSetChanged()
清除所选项目。无论如何都将删除所选项目,因此丢失当前选择状态不太可能成为问题。此方法将保留滚动位置,并应在列表更新时防止闪烁。
答案 2 :(得分:2)
confirmCheckedPositionsById
中的错误(acj的答案中的子弹#7)会导致getItemId
在陈旧位置被调用。但是,它将以正确的位置再次调用以刷新布局。当我遇到这个问题时,我更新了自定义适配器的getItemId
,如此
@Override
public long getItemId(int position) {
return position < getCount() ? getItem(position).getId() : -1;
}
答案 3 :(得分:0)
编辑为:
for (int i = checkedItemsCount-1; i >= 0 ; i--) {
^^^^^
INSTEAD OF
for (int i = checkedItemsCount-1; i >= 0 ; --i) {
答案 4 :(得分:0)
这是一个记录在案的错误,请投票支持:
我的用例是配置为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 case的处理,但很可能需要这样做。我观察到println()总是打印已删除行的索引。 myAdapter.deleteRow()通知数据更改为侦听器,对我说ListView没有正确更新它的已检查索引。我试过这个代码,hasStableIds()从自定义适配器返回true和false,结果相同。
答案 5 :(得分: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);
}
// }
}
}
});
}
});