5

プログラムにリストビューがあります。その中で、データベースから値を入力して表示しました。コンテキストメニューを使用して、リストビューのアイテムを編集、削除しています。コンテキストメニューで削除を選択すると、データベース内のアイテムが削除されますが、リストビューからアイテムを削除していません。ここで何が間違っているのですか。知ってる人いたら教えてください。

取得方法:

public void retrievedb() {
        strquery = "SELECT * FROM api_settings";
        Cursor mCursor = (MainscreenActivity.JEEMAAndroSMSDB).rawQuery(
                strquery, null);
        if (mCursor.getCount() != 0) {
            mCursor.moveToLast();
            for (int i = mCursor.getCount() - 1; i >= 0; i--) {
                dbid = mCursor.getString(0);
                dbapiname = mCursor.getString(1);
                dbURL = mCursor.getString(2);
                dbUnameVar = mCursor.getString(3);
                dbUnameVal = mCursor.getString(4);
                dbPwdVar = mCursor.getString(5);
                dbPwdVal = mCursor.getString(6);
                dbsendername = mCursor.getString(7);
                dbdestinationvar = mCursor.getString(8);
                dbmsgvariable = mCursor.getString(9);
                dbchars = mCursor.getString(10);
            }
        }

        if ((dbapiname == null) || (dbURL == null) || (dbUnameVar == null)
                || (dbUnameVal == null) || (dbPwdVar == null)
                || (dbPwdVal == null) || (dbsendername == null)
                || (dbdestinationvar == null) || (dbmsgvariable == null)
                || (dbchars == null)) {

            tvText = (TextView) findViewById(android.R.id.text1);
            tvText.setVisibility(1);
        } else {
            adapter = new ArrayAdapter<Settingsmodel>(this,
                    android.R.layout.simple_list_item_1, listItems);
            tvText = (TextView) findViewById(android.R.id.text1);
            tvText.setVisibility(View.GONE);
            strquery = "SELECT ID,API_Name FROM api_settings";
            mCursor = (MainscreenActivity.JEEMAAndroSMSDB).rawQuery(strquery,
                    null);
            if (mCursor.getCount() != 0) {
                mCursor.moveToFirst();
                do {
                    dbid = mCursor.getString(0);
                    dbapiname = mCursor.getString(1);
                    listItems.add(new Settingsmodel(dbapiname, dbid));
                    adapter.notifyDataSetChanged();
                } while (mCursor.moveToNext());
            }
        }
    }

コンテキストメニュー:

@Override
    public void onCreateContextMenu(ContextMenu menu, final View v,
            ContextMenuInfo menuInfo) {
        if (v.getId() == android.R.id.list) {
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            Settingsmodel selectedValue = (Settingsmodel) getListAdapter()
                    .getItem(info.position);
            String tempo = selectedValue.getSpinnerText();
            menu.setHeaderTitle(tempo);
            String[] menuItems = getResources().getStringArray(R.array.menu);
            for (int i = 0; i < menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }

        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                .getMenuInfo();
        int menuItemIndex = item.getItemId();
        String[] menuItems = getResources().getStringArray(R.array.menu);
        String menuItemName = menuItems[menuItemIndex];
        Settingsmodel selectedValue = (Settingsmodel) getListAdapter().getItem(
                info.position);
        String temp0 = selectedValue.getSpinnerText();
        String temp1 = selectedValue.getValue();
        int id = Integer.parseInt(temp1);
        if (menuItemName.equalsIgnoreCase("Set as Default")) {
            ContentValues values = new ContentValues();
            values.put(MainscreenActivity.COL_Set_Default, value);
            MainscreenActivity.JEEMAAndroSMSDB.update(
                    MainscreenActivity.TABLE_Name, values, "ID=" + id, null);
            values.put(MainscreenActivity.COL_Set_Default, 0);
            Toast.makeText(getBaseContext(), temp0 + " is set as Default",
                    Toast.LENGTH_LONG).show();
            MainscreenActivity.JEEMAAndroSMSDB.update(
                    MainscreenActivity.TABLE_Name, values, "ID!=" + id, null);
        }

        if (menuItemName.equalsIgnoreCase("Delete")) {
            MainscreenActivity.JEEMAAndroSMSDB.delete(
                    MainscreenActivity.TABLE_Name, "ID=" + id, null);           
            Toast.makeText(getBaseContext(), "API Deleted Successfully",
                    Toast.LENGTH_SHORT).show(); 
            retrievedb();
        }

        return true;
    }
4

5 に答える 5

6

アイテムを削除した後、リストを更新できます

YourListView.setAdapter(YourAdapter); // optional

YourAdapter.notifyDataSetChanged(); // mandatory

楽しい

編集:

最善の方法: (最初の解決策は害を与えません)

listItems.remove(position);
listViewAdapter.notifyDataSetChanged();
于 2012-07-20T09:17:23.880 に答える
4

からアイテムを削除してからlistItems(List)、呼び出します

adapter.notifyDataSetChanged();
于 2012-07-20T08:33:24.430 に答える
2

これには2つの方法があります

1) Once after your Item from list view call the methos adapter.notifyChanged();

                            (or) 
2) create a method that append data to the listview, after delete the record call that method again. its just another way of refreshing listview 
于 2012-07-20T08:37:00.223 に答える
1

UIスレッドで試しましたか:

  listview.remove(position);
        runOnUiThread(new Runnable() {
            public void run() {
                adapter.notifyDataSetChanged();
            }
        });

これが役立つ場合があります。

于 2012-07-20T09:50:54.277 に答える
1

最初に、リストをリストビューに移入するarraylistからアイテムを削除します

arraylist.remove(position);

それから電話する

listview.invalidateViews();
于 2014-05-16T06:24:41.400 に答える