Android SQLite:从ListView获取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

这是我的第一个应用,我在ListView上遇到了一些问题

单击项目后如何在数据库中获取ID? 我不能使用position,因为Id可能不是连续的,即使它符合顺序,有时也不会返回正确的Id

这是我的代码,感谢您的帮助:

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,您可以扩展BaseAdapterListAdapter甚至
ArrayAdapter
来制作自定义适配器。首先,制作一个普通java类,将数据库数据(包括id映射到一个对象。然后制作一个自定义的BaseAdapter不使用ArrayAdapter。在BaseAdapter类中,您必须重写各种方法,包括
getItem
getItemId
方法。现在,您可以从getItem方法返回整个映射对象,只需使用
ListView.getSelectedItem()获取ListView中选定项的对象
方法。一旦获得对象,就可以轻松访问id

您可以找到一个很好的自定义适配器示例和说明


关于将数据库结果映射到对象,您可以很好地获得一些概念,而不是使用ArrayAdapter。您可以扩展BaseAdapterListAdapter甚至
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;
    }
}