SQLite:从 ListView 获取 ID

SQLite: get id from ListView

这是我的第一个应用程序,我在使用 ListView 时遇到了一些问题

点击商品后如何获取数据库中的ID? 我不能使用位置,因为 Id 可能不是连续的,即使它是有序的,有时也不 return 正确的 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);}

好吧,除了使用 ArrayAdapter,您还可以扩展 BaseAdapterListAdapter 甚至 ArrayAdapter 来进行自定义适配器。首先制作一个简单的 java class 将包括 id 在内的数据库数据映射到一个对象。然后制作自定义 BaseAdapter 而不是使用 ArrayAdapter。在您的 BaseAdapter class 中,您必须覆盖各种方法,包括 getItemgetItemId 方法。现在你可以从getItem 方法return 整个映射的对象,并使用Activity 或Fragment class 中的listView.getSelectedItem() 方法简单地获取ListView 的选定项的对象。获得对象后,您可以轻松访问 id。

您可以找到自定义适配器的一个很好的示例和解释 here

关于将数据库结果映射到对象,可以得到一些概念here

解决方法很多。

例如,您可以在 ListView 初始化之前 ArrayList 存储 Id。

即执行"SELECT id FROM mytable"

然后存入arraylist,使用while click方法

示例:

//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();

点击事件:

@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);

        }

并将其初始化为:

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);}

在这里,你可以用这个替换你的代码 class,我添加了一个 cursorAdapter 并将它附加到你的 ListView,在适配器中我添加了一个获取 Id 的方法,我从点击监听器调用从游标中检索 ID,您必须在下面的 MyCursorAdapter class 中为 public void getId(int position) 中的 _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;
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;
    }
}

由于代码未经测试,您可能会在开始时遇到构建问题,但它应该让您了解代码中发生的事情。编译中有什么问题欢迎随时提问