Java 单击ListView中的项目时,从数据库获取项目ID
我是android新手,在我的应用程序中,当我点击listview项目时,我需要从数据库中获取id,然后在第二个活动中使用此id从数据库中检索数据。但我无法从listview获取id (Listview位于主活动中) My Main活动-在我的数据库的列表视图中显示数据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
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>