Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击ListView中的项目时,从数据库获取项目ID_Java_Android_Sqlite - Fatal编程技术网

Java 单击ListView中的项目时,从数据库获取项目ID

Java 单击ListView中的项目时,从数据库获取项目ID,java,android,sqlite,Java,Android,Sqlite,我是android新手,在我的应用程序中,当我点击listview项目时,我需要从数据库中获取id,然后在第二个活动中使用此id从数据库中检索数据。但我无法从listview获取id (Listview位于主活动中) My Main活动-在我的数据库的列表视图中显示数据 public class test extends AppCompatActivity { ImageButton btnadd; SQLiteDatabase sqLiteDatabase; DatabaseOpenHelpe

我是android新手,在我的应用程序中,当我点击listview项目时,我需要从数据库中获取id,然后在第二个活动中使用此id从数据库中检索数据。但我无法从listview获取id (Listview位于主活动中)

My Main活动-在我的数据库的列表视图中显示数据

public class test extends AppCompatActivity {
ImageButton btnadd;
SQLiteDatabase sqLiteDatabase;
DatabaseOpenHelper databaseHelper;
TextView yekuntxt;
    private ListView listView;

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

        this.listView = (ListView) findViewById(R.id.listView);
        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        final List<String> costumer_data = databaseAccess.getData();
        databaseAccess.close();
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, costumer_data);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
                {
                   View view = getLayoutInflater().inflate(R.layout.arrayadapter,null);

                    String Id = listView.getItemAtPosition(position).toString();
                    Intent i =new Intent(test.this, activity_daxilet.class);
                    i.putExtra("ID", position);
                    startActivity(i);

                }

            }
        });

如果您在
列表视图中发送
id
的位置,我认为您希望传递给第二个活动的是
id
本身

因此,改变这一行:

i.putExtra("ID", position);
与:

i.putExtra("ID", Id);
要在第二个活动中检索数据,应使用以下选项,而不是:

Bundle bundle = getIntent().getExtras();
if (bundle !=null){
    ad.setText("@position");
}
这(您还需要按id查找您的textview):

如果没有,您需要在
文本视图中添加id!将此标记添加到
xml
文件中的
textview

android:id="@+id/textviewid"
应该就是这样。

单向:

  • 我们可以在从数据库获取客户数据时获取id(getData),例如:选择id
  • 将其作为额外视图传递到第二个视图,而不是当前设置的位置

祝您好运

为ListAdapter使用第三个参数位置不会等于id,尤其是在行已被删除的情况下

最简单的方法是使用游标适配器,在这种情况下,id将是传递给
onItemClickListener
的第四个参数。
SimpleCursorAdapter
可能就足够了

要转换为使用SimpleCorsorAdapter,请执行以下操作:-

  • 向DatabaseAccess.java添加一个方法以返回游标(或替换getData方法),例如
  • :-

    • 注意,不清楚是否定义了id列或其名称。游标适配器需要一个名为\u id的列(
      BaseColumns.\u id
      解析为
      \u id
      ),因此使用上述方法。
      • 使用了查询便利方法而不是rawQuery方法,尽管它可能看起来更复杂,但建议使用它而不是rawQuery

  • 对于测试,向DatabaseAccess.java添加一个方法以允许添加数据
  • :-

    • 注意:如果您已有数据或具有等效方法,则可能不需要此项

  • 修改主要活动
  • :-

  • 修改activity_daxilet.xml以包含文本视图showPasseId
  • e、 g:-

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activity_daxilet">
        <TextView
            android:id="@+id/showpassedid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
    
    
    结果 首次运行时:-

    单击项目(3):-

    在SELECT语句中,您不会获取id,因此不会将其存储在适配器中的任何位置。您希望如何通过单击列表找到id?@mTak所以,我也应该选择id,但不正确显示它?但是之后如何从listview中获取它呢?请查看传递给
    onItemClick
    方法的最后一个参数,并使用
    SimpleCorsOrAdapter
    -就是这样-您不必使用任何
    列表客户数据
    getData()
    atall@pskink现在我正在尝试将它们改为SimpleCorsorAdapter,但由于我是新手,我遇到了一些困难,谢谢你的回答我在主要活动中更改了它,但仍然给我错误,在第二个活动中,我应该使用哪种方法在文本视图中显示主活动的数据?@ElnurHasanov那么,你是否如我所说使用了
    SimpleCursorAdapter
    ?@user007当我单击listview传递给第二个活动时,应用程序停止工作。可能是因为捆绑part@ElnurHasanov我更新了我的答案,看看!!希望有帮助。首先感谢您的详细解释,它太有用了,但是当我应用这些代码时,它会给我错误:这个,android.R.layout.simple_list_item_2,新字符串[]{“AD”,“SOYAD”},新int[],android.R.id.text1,android.R.id.text2},0);部分它说SimpleCursorAdapter()中的SimpleCursorAdapter()无法应用于此处您可以在此处看到错误@ElnurHasanov您忘记了光标:
    cursor,//@pskink谢谢,错误已解决,但当我运行应用程序时,它说它已停止@ElnurHasanov检查
    
    ad = findViewById(R.id.textviewid);
    Intent intent = getIntent();
    String Id = intent.getExtras().getString("ID");
    ad.setText(Id);
    
    android:id="@+id/textviewid"
    
    public Cursor getDataAsCursor() {
        String[] columns = new String[]{"AD","SOYAD","rowid AS " + BaseColumns._ID};
        return this.database.query(
                "costumer_data",
                columns,
                null,null,null,null,null
        );
    }
    
    public long addRow(String ad, String soyad) {
        ContentValues cv = new ContentValues();
        cv.put("AD",ad);
        cv.put("SOYAD",soyad);
        return this.database.insert("costumer_data",null,cv);
    }
    
    public class test extends AppCompatActivity {
        ImageButton btnadd; //??
        SQLiteDatabase sqLiteDatabase; // NOT NEEDED
        DatabaseOpenHelper databaseHelper; // NOT NEEDED
        TextView yekuntxt; //??
        private ListView listView;
        SimpleCursorAdapter adapter; // ADDED
        Cursor cursor; // ADDED
        DatabaseAccess databaseAccess; // ADDED
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
    
            this.listView = (ListView) findViewById(R.id.listView);
            databaseAccess = DatabaseAccess.getInstance(this); // Changed to use class variable
            databaseAccess.open();
            addSomeData(); // <<<< ADDED for testing (adds some data to the table (4 rows as below))
            cursor = databaseAccess.getDataAsCursor(); // ADDED
            //final List<String> costumer_data = databaseAccess.getData(); // REMOVED
            //databaseAccess.close(); // <<<<<<<<<< MUST NOT CLOSE DB WHEN using Cursor (see onDestory method)
            adapter = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2, // (show AD and SOYAD seprately)
                    cursor, //<<<< The cursor used for the source data of the ListView
                    new String[]{"AD","SOYAD"}, // The columns FROM which to get the data
                    new int[]{android.R.id.text1, // The respective views TO which the data is placed
                            android.R.id.text2},
                    0
            );
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
                    {
                        Intent i = new Intent(test.this, activity_daxilet.class);
                        i.putExtra("ID", id);
                        startActivity(i);
                    }
                }
            });
        }
    
        //<<<<<<<<<< Added to close the Cursor  and then database when done with it
        @Override
        protected void onDestroy() {
            cursor.close();
            databaseAccess.close();
            super.onDestroy();
        }
    
        //<<<<<<<<<< Added to load some data for testing
        private void addSomeData() {
            databaseAccess.addRow("TestAD1","TestSOYAD1");
            databaseAccess.addRow("TestAD2","TestSOYAD2");
            databaseAccess.addRow("TestAD3","TestSOYAD3");
            databaseAccess.addRow("TestAD4","TestSOYAD4");
        }
    }
    
    public class activity_daxilet extends AppCompatActivity {
    
        TextView showpassedid;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_daxilet);
            showpassedid = (TextView) this.findViewById(R.id.showpassedid);
    
            long passedid = this.getIntent().getLongExtra("ID",-1);
            showpassedid.setText("Id Passed was " + String.valueOf(passedid));
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activity_daxilet">
        <TextView
            android:id="@+id/showpassedid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>