【问题标题】:android how to sync onitemclicklistener listview id and database idandroid如何同步onitemclicklistener listview id和数据库id
【发布时间】:2016-05-30 19:29:18
【问题描述】:

这是this question的继任者

起初一切正常,但在 2 删除后,痛苦开始了。数据库条目从 ID 1 开始,然后是 2,依此类推。可以说我有三个数据库条目。这三个条目的列表视图 ID 是 2,1 和 0。 数据库条目是 1,2 和 3。1 和 2 将使用 onitemclicklistener 删除,但由于列表视图没有 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");

    }

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

【问题讨论】:

    标签: android mysql database listview


    【解决方案1】:

    您的数据库和 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);
    

    【讨论】:

    • 这是一个德语单词 ;-) 我会将其翻译为“eventdata” 好的,我会尝试您的方法。谢谢你的回答。
    【解决方案2】:

    在尝试了 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) 获取第一个数据库条目的 id (s_rowId) 并将其转换为 long (rowId)。 现在我从列表视图中获取long id,并将其添加到rowId,这是我的deleteId。有了这个,我在列表视图中单击的内容具有正确的数据库值,并且可以将其传递给database.delete

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2015-11-12
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多