1

Gmail のようなリストビューを作成しようとしています。つまり、最初はリストビューは単一選択モードですが、チェックボックスを選択すると複数選択になります。

これは私がこれまでに持っているものです:

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(this, R.layout.listitem, cursor,
             new String[]{"_id","a","b","c","d","e","f","g","h"}, 
             new int[] { R.id.checkBox1, R.id.a, R.id.b, R.id.c, R.id.d, R.id.e}
// all of these are a part of my list item custom layout.
             );

    dataSource.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

@Override
public boolean setViewValue(View aView, final Cursor c, int i) {

    String s=c.getString(i);
    String toset="";
    TextView tv = i==0?null: (TextView) aView;
    if (i==0){
        if(chkL==null){
            chkL=new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton cb1, boolean isChecked) {
                    CheckBox cb=(CheckBox) cb1;
                    chkid[c.getPosition()]=isChecked;

                    if(lv.getChoiceMode()!=lv.CHOICE_MODE_MULTIPLE){
                        lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
                    }
                    lv.setItemChecked(c.getPosition()+1,isChecked);
                    log(isChecked+" selected "+(c.getPosition()+1));
                }

        };
        }

        CheckBox cb= (CheckBox) aView;
        cb.setOnCheckedChangeListener(chkL);

        return (i==0);
    }};

現在、チェックボックスを押して、少なくともアイテムを「選択」しようとしています。c.getPosition()+1(カーソルの位置) を使用して、タップされたリスト項目の位置を取得しています。しかし、それは常にランダムな値を返す1か、時にはランダムな値を返すようです。

更新: 常に 1 を返すように見えますが、getCheckedItemPositions() を反復すると、アイテム番号が表示されます。10名が選ばれます。別のチェックボックスをタップすると、カーソル位置は 1 になりますが、項目 11 が選択されます。しかし、チェックボックスの外側をタップすると、正しいアイテムが選択されます。

また、1 つのチェックボックスを選択して下にスクロールすると、他のいくつかのチェックボックスがオンになっていることがわかります。(リストには約255のアイテムがあります)。同じチェックボックスを再利用するAndroidの方法が原因だと思いますか?

4

1 に答える 1

0

私は少し異なるアプローチを試みます:

  • ListView をのままSINGLE_CHOICEにしますが、各行の CheckBox を、行idを List と呼ばれるリストに追加/削除するリスナーで設定しますcheckedRows(たとえば)。

  • チェックされた行を削除、移動、星付けなどしたい場合: 反復しcheckedRowsて必要なアクションを実行します。

複数のタイプのデフォルト状態と機能の間で切り替えを行ったり来たりするよりも簡単だと思います。

添加

をオーバーライドsetViewValue()したことはありませんが、これは機能するはずです:

CheckBox cb= (CheckBox) aView;
cb.setOnCheckedChangeListener(chkL);
cb.setTag(c.getLong(c.getColumnIndex("_id"))); // Add this

そしてあなたのonClickListener()

long id = (Long) cb1.getTag();
于 2012-06-03T22:08:44.990 に答える