这是this question的继承者

最初,一切正常,但是2删除后,苦难开始了。数据库条目以ID 1开头,然后以2开头,依此类推。可以说我有三个数据库条目。这三个条目的列表视图ID是2,1和0。
数据库条目分别为1,2和3。1和2将通过onitemclicklistener删除,但是由于listview没有ID 3,因此永远不会删除相应的数据库条目。

所以问题是,如何“同步”这两个ID?

列表视图类

public class anzeigen extends AppCompatActivity {

    private static final String TAG = anlegen.class.getSimpleName();
    private static final String FILENAME = TAG + ".kdf";
    private List valueList = new ArrayList<String>();
    final VorgangDataSource dataSource = new VorgangDataSource(this);


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_anzeigen);

        Log.d(TAG,"Die Datenquelle wird geöffnet!");
        dataSource.open();

        final List<vorgangsdaten> vorgangsdatenList = dataSource.getAllVorgangsDaten();

        final ArrayAdapter<vorgangsdaten> VorgangArrayAdapter = new ArrayAdapter<>(
                this,
                R.layout.mylistlayout,
                vorgangsdatenList
        );

        final ListView lv = (ListView)findViewById(R.id.listView);
        lv.setAdapter(VorgangArrayAdapter);
        lv.setItemsCanFocus(false);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String s_id = String.valueOf(id);
                Log.d(s_id,"id_in_onitem");

                String p_id = String.valueOf(position);
                Log.d(p_id,"position_on_item");

                int pos = position;
                vorgangsdatenList.remove(pos);
                dataSource.deleteRow(id);
                VorgangArrayAdapter.notifyDataSetChanged();
            }
        });


        //ActionBar Costumization
        android.support.v7.app.ActionBar ab = getSupportActionBar();
        ab.setIcon(R.drawable.search1);
        ab.setDisplayShowHomeEnabled(true);
        ab.setDisplayUseLogoEnabled(true);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        dataSource.close();
    }
}


deleteRow-Method:

public void deleteRow(long id){

        String s_id;
        s_id = String.valueOf(id);

        Log.d(s_id,"id_value");

        database.delete(VorgangDbHelper.TABLE_VORGAENGE_LIST,VorgangDbHelper.COLUMN_ID + " = ?", new String[] {s_id});

        long deleteID = database.delete(VorgangDbHelper.TABLE_VORGAENGE_LIST,VorgangDbHelper.COLUMN_ID + " = ?", new String[] {s_id});
        String s_del = String.valueOf(deleteID);
        Log.d(s_del,"delete_row_value");

    }


如果您需要更多代码,请告诉我:)

最佳答案

您的数据库和ListView项之间没有同步。

选择数据时,请从表中选择ID,并将其也保存在内存中。

由于vorgangsdaten看起来是德语或瑞典语,因此我很难理解这些词的含义。 ListView对每个项目都有自己的“ id”,以保持它们的列表显示,其余的则“隐藏”。您需要做的是创建一个Object,其中的详细信息与数据库同步,单击列表项时,“列表ID”用于查询Object并从数据库中删除。

一个例子是:

ArrayList<MyObject> arrayListData = new ArrayList<>();
ArrayList<String> arrayListNames = new ArrayList<>();
MyObject stuffs = database.query(); // In here, fetch the data
/* I am simplifing the MyObject to [String name, String aValue, int aNumber] */
for(MyObject s: stuffs){
   arrayListData.add(s);
   arrayListNames.add(s.name);
}
arrayAdapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_1,
                arrayListNames
        );

listView.setOnItemClickListener(
                new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        MyObject thing = arrayListData.get(position);
                        database.delete(thing.aNumber);
                    }
                }
        );
listView.setAdapter(arrayAdapter);

07-24 09:47
查看更多