6

アダプタ クラスを使用して Item クラスの ArrayAdapter を拡張するカスタム Listview があります。NONE、Single、Multi の選択モードを切り替えることができます。これはすべてうまくいきます。私が今実装しようとしているのは、複数選択モードのときに複数選択でリスト ビュー (およびアダプター) からアイテムを削除する方法です。ただし、次のいずれかを実行すると IndexOutOFBounds Exceptions が発生します。1) SINGLE 選択モードでリストビューの最後の項目を削除します (注: 最後の項目の前にあるものはすべて削除できます) 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 の行はクラッシュせず、ログは期待どおりに動作していることを示しているようです。Index Out Of Bounds Exception が発生するエラーを誰かが見ることができますか?

また、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)
4

6 に答える 6

4

バグconfirmCheckedPositionsById(acj の回答の箇条書き #7) によりgetItemId、古い位置で呼び出されます。ただし、レイアウトを更新するために正しい位置で再度呼び出されます。この問題に遭遇したとき、カスタムアダプタを更新しましgetItemId

@Override
public long getItemId(int position) {
    return position < getCount() ? getItem(position).getId() : -1;
}
于 2013-03-28T21:52:07.580 に答える
4

AbsListViewこの問題を引き起こすバグがあるようです。およびAbsListViewを含むの任意のサブクラスで発生する可能性があります。ListViewGridView

単一選択モードおよび複数選択モードでは、は、でオンになっている項目のセットを確認することによって、アダプタListView の呼び出しに応答します。選択した項目はその時点でデータセットから既に削除されているため、アダプターは例外をスローします。特に、この問題は、アダプターのメソッドが を返す場合にのみ発生します。notifyDataSetChanged()confirmCheckedPositionsById()hasStableIds()true

大まかに言えば、これは関連するパスです。

  1. ListView で 1 つ以上の項目を選択した場合
  2. ListView、選択された項目のリストを更新します
  3. 削除ボタンをクリックすると
  4. アイテムがデータセットから削除されます
  5. アダプターを呼び出すとnotifyDataSetChanged()、オブザーバーにデータセットが変更されたことを通知します。ListViewはそれらのオブザーバーの 1 つです。
  6. 次にListViewが再描画されると、アダプタの通知が表示され、 が呼び出されますhandleDataChanged()。この時点で、 は、現在削除されている項目が選択され、データセット内にあるとListViewまだ考えています。
  7. handleDataChanged()メソッドは を呼び出します。これは、古い位置を使用してアダプターでconfirmCheckedPositionsById()呼び出しを試みます。getItemId()削除されたアイテムがたまたまリストの末尾近くにある場合、この位置は配列の範囲外である可能性が高く、アダプターは をスローしIndexOutOfBoundsExceptionます。

次の 2 つの回避策が考えられます。

  • 他の回答に記載されているように、データセットが変更されるたびに新しいアダプターを作成します。これには、手動で保存して復元しない限り、現在のスクロール位置が失われるという残念な結果があります。

  • アダプターを呼び出す前clearChoices()に、ListView(または) を呼び出して、選択した項目をクリアします。いずれにせよ、選択された項目は削除されるため、現在の選択状態が失われても問題になることはほとんどありません。このメソッドはスクロール位置を保持し、リストの更新中のちらつきを防ぎます。GridViewnotifyDataSetChanged()

于 2013-01-08T19:03:54.473 に答える
3

わかりました私は問題を解決しました!!! わーい!

IndexOutOFBounds Exception を防ぐために私がしなければならなかったことは、リスト ビュー アダプターをリセットして、リスト ビューの内容を更新することでした。だから魔法の線は

 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);
    }
}
于 2012-07-25T03:21:50.390 に答える
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.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 の両方を返し、同じ結果が得られました。

于 2014-04-11T04:59:02.530 に答える
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);
                                }
                                // }
                            }

                        }
                    });

        }
    });
于 2014-09-15T10:09:40.650 に答える
-1

として編集:

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

のインストール

for (int i = checkedItemsCount-1; i >= 0 ; --i) {
于 2012-07-23T13:36:35.213 に答える