android如何同步onitemclicklistener listview id和数据库id

时间:2016-05-30 19:29:18

标签: android mysql database listview

这是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-方法:

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");

    }

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

2 个答案:

答案 0 :(得分:1)

您的数据库与ListView项目之间没有同步性。

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

由于vorgangsdaten看起来像德国人或瑞典人,我无法理解这些词的含义。 ListView为每个项目都有自己的“id”,以显示它们的列表,其余的“隐藏”。您必须做的是拥有一个Object,其中包含与数据库同步的详细信息,单击列表项时,“list 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);

答案 1 :(得分:0)

在尝试Bonattis回答并尝试了一点后,我找到了另一个答案。

<强> deleteRow-方法

public void deleteRow(long id){

        String s_id;                    //String for long id
        s_id = String.valueOf(id);      //assign String value of id
        String s_rowId = null;          //String for rowid
        long rowId = 0;
        long deleteId = 0;
        String s_deleteId = null;

        Log.d(s_id,"id_value");

        Cursor cursor = database.query(VorgangDbHelper.TABLE_VORGAENGE_LIST,columns,null,null,null,null,null);

        if(cursor.moveToFirst()) {
            s_rowId = cursor.getString(cursor.getColumnIndex(VorgangDbHelper.COLUMN_ID));
            rowId = Long.parseLong(s_rowId);
            deleteId = rowId + id;
            s_deleteId = String.valueOf(deleteId);
            Log.d(s_rowId,"rowID");
            Log.d(s_deleteId,"deleteID");
        }

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

它现在如何运作?

因此deleteRow-Method(dRM)获取第一个数据库条目(s_rowId)的id并将其转换为long(rowId)。 现在,我从列表视图中传递long id并将其添加到rowId,即deleteId。有了这个,我有一个正确的数据库值,我在listview中点击了它,并可以将其传递给database.delete