我在主活动中有一个SQLite数据库和一个ListView显示。在ListView中,我将显示每个列表编号的详细信息,并在按下列表项时,将打开一个新活动,该活动将在TextView中显示详细信息。

我为每个这些ListView都具有删除功能,但它们无法正常工作。本质上,每个创建的ListView都具有唯一的ID,这就是SQLite数据库应如何工作。但是,在删除ListView中的行时,唯一ID会增加,但行ID会删除该数字并将所有内容向上移动。这意味着删除项目后,行ID和数据库ID不再匹配,并且尝试在ListView中选择项目时,它会崩溃。这是我的数据库适配器类的摘录:

 public Integer deleteStat(Integer id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(STATS_TABLE, "id = ? ", new String[]{Integer.toString(id)});
}


这是我在主要活动中的第一次尝试。我从this帖子中获得了一些信息,但是无法获取正确的整数并收到语法错误:

obj.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

 TextView pos = (TextView) findViewById(R.id.editTitle);
 displayText(Integer.parseInt(pos.getText().toString()));
        }
    });
}

public void displayText(int pos)
{
    pos++;
    String s = "";
    s += pos;

    Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);
    intent.putExtra("id", s);
    startActivity(intent);

}


这是我在主要活动中的第二次尝试。我使用了this教程来帮助我。我从该网站使用的代码破坏了整个删除功能:

 obj.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
           int id_To_Search = arg2 + 1;
           int id_To_Search = arg0.getCount() - arg2;

           Bundle dataBundle = new Bundle();
            dataBundle.putInt("id", id_To_Search);

            Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);

           intent.putExtras(dataBundle);
           startActivity(intent);


如何获取数据库ID与行ID匹配?有什么建议吗?

编辑:在哈希映射代码中添加。当我按ListView项目时,什么也没有发生

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

    mydb = new StatisticsDbAdapter(this);
    ArrayList array_list = mydb.getAllStats();
    ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array_list);

    obj = (ListView) findViewById(R.id.listView1);
    obj.setAdapter(arrayAdapter);
    /*
     New code starts here
    */
   Bundle extras = getIntent().getExtras();
    if (extras != null) {
        int Value = extras.getInt("id");

        if (Value > 0) {
            //means this is the view part not the add contact part
            Cursor cursor = mydb.getData(Value);
            hashMap.put(cursor.getString(1), cursor.getInt(0));

 obj.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int arg2, long arg3) {
     TextView textView = (TextView) view.findViewById(R.id.editTitle);
                    Bundle dataBundle = new Bundle();
                    dataBundle.putInt("id", hashMap.get(textView.getText().toString()));

                    Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);

                    intent.putExtras(dataBundle);
                    startActivity(intent);
 }
            });
        }
    }
}

最佳答案

您永远不应传递ListView位置来删除数据库中的行。我已经做过很多次了。首先,在您要管理点击事件的类中,创建一个新的HashMap。此HashMap将用于存储数据库中的行ID,我们将引用该行ID,而不是ListView项位置。要创建它,请输入以下代码:

public HashMap<String, Integer> hashMap = new HashMap<>();


完成此操作后,在显示ListView中所有行的函数中,还必须将相同的项目加载到HashMap中,如下所示:

hashMap.put(cursor.getString(1), cursor.getInt(0));


请注意,cursor.getString(1)可能不是您所使用的。请用您存储有名称的适当列号替换1。 cursor.getInt(0)从数据库获取行ID,列号对于您也可能有所不同。现在,在我们的OnClickListener函数中,我们可以输入:

obj.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view) {
       TextView textView = (TextView) view.findViewById(R.id.editTitle);
       Bundle bundle = new Bundle();
       bundle.putInt("id", hashMap.get(textView.getText().toString()));

       Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);

       intent.putExtras(bundle);
       startActivity(intent);
}


请注意,hashMap变量必须与管理ListView的单击事件的类位于同一类中,否则会出错。您最初通过的某些参数已删除,因为您不需要它们。此外,我发现使用RecyclerView可以使此方法更好地工作,但这取决于您。如果您有任何问题,请随时在下面评论,我会尽快答复。

10-08 07:18
查看更多