Android SQLite:从ListView获取id
这是我的第一个应用,我在ListView上遇到了一些问题 单击项目后如何在数据库中获取ID? 我不能使用position,因为Id可能不是连续的,即使它符合顺序,有时也不会返回正确的Id 这是我的代码,感谢您的帮助:Android SQLite:从ListView获取id,android,sqlite,listview,android-sqlite,Android,Sqlite,Listview,Android Sqlite,这是我的第一个应用,我在ListView上遇到了一些问题 单击项目后如何在数据库中获取ID? 我不能使用position,因为Id可能不是连续的,即使它符合顺序,有时也不会返回正确的Id 这是我的代码,感谢您的帮助: import android.content.Intent; import android.database.Cursor; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; imp
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class livello1 extends AppCompatActivity {
DatabaseHelper myDb;
Button next;
@Override
protected void onCreate(Bundle savedInstanceState) {
myDb = new DatabaseHelper(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.livello1);
populateListView();
registerClick();
}
private void registerClick(){
ListView list =(ListView)findViewById(R.id.listViewMain);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
Intent i = new Intent(livello1.this, bossi.note.Edit.class);
i.putExtra("id", position);
//i.putExtra("id", id);
startActivity(i);
}
});
}
private void populateListView(){
Cursor res = myDb.getAllData();
String[] myItems = new String[myDb.numRow()];
int cont = 0;
if(res.getCount() == 0){
// show message
return;
}
while( res. moveToNext()){
myItems[cont] = res.getString(1);
cont ++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.da_item, myItems);
ListView list =(ListView)findViewById(R.id.listViewMain);}
导入android.content.Intent;
导入android.database.Cursor;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.ActionMode;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.AbsListView;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.ListView;
公共类livello1扩展了AppCompatActivity{
数据库助手myDb;
按钮下一步;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
myDb=新数据库助手(此);
super.onCreate(savedInstanceState);
setContentView(R.layout.livello1);
populateListView();
registerClick();
}
私有无效注册表单击(){
ListView列表=(ListView)findViewById(R.id.listViewMain);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图已单击、整型位置、长id){
Intent i=新的Intent(livello1.this,bossi.note.Edit.class);
i、 putExtra(“id”,位置);
//i、 putExtra(“id”,id);
星触觉(i);
}
});
}
私有void populateListView(){
Cursor res=myDb.getAllData();
String[]myItems=新字符串[myDb.numRow()];
int cont=0;
如果(res.getCount()==0){
//显示消息
返回;
}
while(res.moveToNext()){
myItems[cont]=res.getString(1);
cont++;
}
ArrayAdapter=新的ArrayAdapter(this,R.layout.da_项,myItems);
ListView列表=(ListView)findViewById(R.id.listViewMain);}
不用ArrayAdapter,您可以扩展BaseAdapter或ListAdapter甚至ArrayAdapter
来制作自定义适配器。首先,制作一个普通java类,将数据库数据(包括id映射到一个对象。然后制作一个自定义的BaseAdapter不使用ArrayAdapter。在BaseAdapter类中,您必须重写各种方法,包括getItem
和getItemId
方法。现在,您可以从getItem方法返回整个映射对象,只需使用ListView.getSelectedItem()获取ListView中选定项的对象
方法。一旦获得对象,就可以轻松访问id
您可以找到一个很好的自定义适配器示例和说明
关于将数据库结果映射到对象,您可以很好地获得一些概念,而不是使用ArrayAdapter。您可以扩展BaseAdapter或ListAdapter甚至
ArrayAdapter
来创建自定义适配器。首先,创建一个普通java类来映射数据库数据,包括id到一个对象。然后创建一个自定义的BaseAdapter而不是使用ArrayAdapter。在BaseAdapter类中,您必须重写各种方法,包括getItem
和getItemId
方法。现在,您可以从getItem方法返回整个映射对象,只需获取所选对象通过在Activity或Fragment类中使用ListView.getSelectedItem()
方法来访问ListView的m。一旦获得对象,就可以轻松访问id
您可以找到一个很好的自定义适配器示例和说明
关于将数据库结果映射到对象,您可以得到一些概念,有很多解决方法 例如,可以在ListView初始化之前存储Id的if
ArrayList
也就是说,执行“从mytable中选择id”
然后存储在arraylist中,并使用whileClick方法
例如:
//in class declaration
private ArrayList<Long> ar_ids = new ArrayList<Long>;
//
String sql = "SELECT id FROM table";
Cursor cur = db.rawQuery(sql, null);
String out = "";
ArrayList<Long> ar_ids = new ArrayList<Long>;
if (cur.moveToFirst()) {
do {
ar.add(cur.getString(0));
} while (cur.moveToNext());
}else{
}
}
cur.close();
//类内声明
private ArrayList ar_id=新的ArrayList;
//
String sql=“从表中选择id”;
游标cur=db.rawQuery(sql,null);
串出“”;
ArrayList ar_id=新的ArrayList;
if(cur.moveToFirst()){
做{
ar.add(cur.getString(0));
}while(cur.moveToNext());
}否则{
}
}
cur.close();
单击事件:
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
Intent i = new Intent(livello1.this, bossi.note.Edit.class);
i.putExtra("id", ar_id.get(position));
//this is awsome!
startActivity(i);
}
@覆盖
public void onItemClick(AdapterView父对象、视图已单击、整型位置、长id){
Intent i=新的Intent(livello1.this,bossi.note.Edit.class);
i、 putExtra(“id”,ar_id.get(position));
//这太可怕了!
星触觉(i);
}
并将其初始化如下:
private void myfunc() {
String sql = "SELECT id FROM table";
Cursor cur = myDb.rawQuery(sql, null);
String out = "";
ArrayList<Long> ar_ids = new ArrayList<Long>;
if (cur.moveToFirst()) {
do {
ar.add(cur.getString(0));
} while (cur.moveToNext());
}else{
throw new NullPointerException();
}
}
cur.close();
}
private void populateListView(){
myfunc();
Cursor res = myDb.getAllData();
String[] myItems = new String[myDb.numRow()];
int cont = 0;
if(res.getCount() == 0){
// show message
return;
}
while( res. moveToNext()){
myItems[cont] = res.getString(1);
cont ++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.da_item, myItems);
ListView list =(ListView)findViewById(R.id.listViewMain);}
private void myfunc(){
String sql=“从表中选择id”;
cursorcur=myDb.rawQuery(sql,null);
串出“”;
ArrayList ar_id=新的ArrayList;
if(cur.moveToFirst()){
做{
ar.add(cur.getString(0));
}while(cur.moveToNext());
}否则{
抛出新的NullPointerException();
}
}
cur.close();
}
私有void populateListView(){
myfunc();
Cursor res=myDb.getAllData();
String[]myItems=新字符串[myDb.numRow()];
int cont=0;
如果(res.getCount()==0){
//显示消息
返回;
}
while(res.moveToNext()){
myItems[cont]=res.getString(1);
cont++;
}
ArrayAdapter=新的ArrayAdapter(this,R.layout.da_项,myItems);
ListView列表=(ListView)findViewById(R.id.listViewMain);}
有很多解决方案
例如,您可以存储
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class livello1 extends AppCompatActivity {
DatabaseHelper myDb;
Button next;
private MyCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
myDb = new DatabaseHelper(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.livello1);
populateListView();
registerClick();
}
private void registerClick(){
ListView list =(ListView)findViewById(R.id.listViewMain);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
Intent i = new Intent(livello1.this, bossi.note.Edit.class);
//retrieve id from cursor
int _id = adapter.getId(position)
i.putExtra("id", _id);
//i.putExtra("id", id);
startActivity(i);
}
});
}
private void populateListView(){
Cursor res = myDb.getAllData();
adapter = new MyCursorAdapter(this, res, 0);
ListView list =(ListView)findViewById(R.id.listViewMain);
list.setAdapter(adapter);
}
//adapter for list view
class MyCursorAdapter extends CursorAdapter {
Cursor cursor;
// Default constructor
public MyCursorAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, flags);
this.cursor = cursor;
}
public void bindView(View view, Context context, Cursor cursor) {
String text = cursor.getString(1);
//make sure the TextView id is "@+id/text1" in da_item.xml
TextView tvText = (TextView) view.findViewById(R.id.text1);
tvText.setText(text);
}
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflator inflater = (LayoutInflater) context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
return Inflater.inflate(R.layout.da_item, parent, false);
}
public int getId(int position){
cursor.moveToPosition(position);
int colId = //set id column number here
int id = cursor.getLong(colId);
return id;
}
}