0
  Cursor smCursor = getContentResolver().query( 
            Uri.parse("content://contact"),
            new String[] { "_id", "address", "body" }, "address like?",
            new String[] { searchContactPhone }, null); 
CustomAdapter ada = new CustomAdapter(this,
                R.layout.sm_layout, smCursor, new String[] {
                        "body" }, new int[] {
                        R.id.txt2 });
        lvSm.setAdapter(ada);

btnDel.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {


            ArrayList<Boolean> ca = ada.getItemsThatAreChecked();
            // this ArrayList will hold our Strings from the rows that were clicked.
            ArrayList<String> results = new ArrayList<String>();
            int s = ca.size();
            for (int i = 0; i < s; i++) {
                    if (ca.get(i).booleanValue()) {
                            smCursor.moveToPosition(i);
                            Log.v("sss", smCursor.getString(smCursor.getColumnIndex("_id")));
                            results.add(smCursor.getString(smCursor.getColumnIndex("_id")));
                    }
            }
            if(results != null && !results.isEmpty()){
                String [] mSelectionArgs  = results.toArray(new String[results.size()]);
                String mSelectionClause = "_id=?";
                int delCursor = 0;

                Uri uri = Uri.parse("content://contact");
                for(int delCount = 0;delCount < mSelectionArgs.length;delCount++)
                {
                delCursor = getContentResolver().delete(uri ,mSelectionClause,new String[]{mSelectionArgs[delCount]});
                }
                ada.notifyDataSetChanged();
                Toast.makeText(getApplicationContext(), mSelectionArgs.length +" number of rows deleted", 5).show();

            }
            else
                Toast.makeText(getApplicationContext(), "Sorry no deletion occurs", 5).show();


        }

リストビューから選択したアイテムを削除し、削除後、次のアイテムに自動的に選択が行われるため、リストビューを更新するにはどうすればよいですか。notifyDataSetChanged()を使用しましたが、機能しません。カスタムアダプタを使用しています。

4

2 に答える 2

0
btnDel.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {


            ArrayList<Boolean> ca = ada.getItemsThatAreChecked();
            // this ArrayList will hold our Strings from the rows that were clicked.
            ArrayList<String> results = new ArrayList<String>();
            int s = ca.size();
            for (int i = 0; i < s; i++) {
                    if (ca.get(i).booleanValue()) {
                            smCursor.moveToPosition(i);
                            Log.v("sss", smCursor.getString(smCursor.getColumnIndex("_id")));
                            results.add(smCursor.getString(smCursor.getColumnIndex("_id")));
                    }
            }
            if(results != null && !results.isEmpty()){
                String [] mSelectionArgs  = results.toArray(new String[results.size()]);
                String mSelectionClause = "_id=?";
                int delCursor = 0;

                Uri uri = Uri.parse("content://contact");
                for(int delCount = 0;delCount < mSelectionArgs.length;delCount++)
                {
                delCursor = getContentResolver().delete(uri ,mSelectionClause,new String[]{mSelectionArgs[delCount]});
                }
        ada = new CustomAdapter(this,
                R.layout.sm_layout, smCursor, new String[] {
                        "body" }, new int[] {
                        R.id.txt2 });
        lvSm.setAdapter(ada);

                Toast.makeText(getApplicationContext(), mSelectionArgs.length +" number of rows deleted", 5).show();

            }
            else
                Toast.makeText(getApplicationContext(), "Sorry no deletion occurs", 5).show();


        }

カスタムアダプターのインスタンスを再作成し、削除後にリストビューにバインドするだけなので、問題なく動作します。

于 2012-05-14T14:47:50.047 に答える
0

削除後に機能させるには、notifyDataSetChanged メソッドを呼び出す前にデータソースを変更する必要があります。これは smCursor.requery(); によって実現できます。メソッドですが、非推奨のメソッドとして、クエリを再度実行することをお勧めします。そのため、削除ボタンをクリックしたときのコード ブロックは次のようになります。

btnDel.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {


            ArrayList<Boolean> ca = ada.getItemsThatAreChecked();
            // this ArrayList will hold our Strings from the rows that were clicked.
            ArrayList<String> results = new ArrayList<String>();
            int s = ca.size();
            for (int i = 0; i < s; i++) {
                    if (ca.get(i).booleanValue()) {
                            smCursor.moveToPosition(i);
                            Log.v("sss", smCursor.getString(smCursor.getColumnIndex("_id")));
                            results.add(smCursor.getString(smCursor.getColumnIndex("_id")));
                    }
            }
            if(results != null && !results.isEmpty()){
                String [] mSelectionArgs  = results.toArray(new String[results.size()]);
                String mSelectionClause = "_id=?";
                int delCursor = 0;

                Uri uri = Uri.parse("content://contact");
                for(int delCount = 0;delCount < mSelectionArgs.length;delCount++)
                {
                delCursor = getContentResolver().delete(uri ,mSelectionClause,new String[]{mSelectionArgs[delCount]});
                }


            smCursor = getContentResolver().query( 
            Uri.parse("content://contact"),
            new String[] { "_id", "address", "body" }, "address like?",
            new String[] { searchContactPhone }, null); 
                ada.notifyDataSetChanged();
                Toast.makeText(getApplicationContext(), mSelectionArgs.length +" number of rows deleted", 5).show();

            }
            else
                Toast.makeText(getApplicationContext(), "Sorry no deletion occurs", 5).show();


        }
于 2012-05-14T04:41:00.057 に答える