SQLite:从ListView获取id

时间:2016-09-08 16:15:02

标签: android sqlite listview android-sqlite

这是我的第一个应用,我在使用ListView

时出现问题

如何在点击项目后获取数据库中的ID? 我不能使用位置,因为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);}

3 个答案:

答案 0 :(得分:0)

而不是使用ArrayAdapter,您可以扩展 BaseAdapter ListAdapter 甚至是option来制作自定义适配器。首先,创建一个普通的java类,将您的数据库数据(包括 id )映射到一个对象。然后创建自定义 BaseAdapter ,而不是使用ArrayAdapter。在BaseAdapter类中,您必须覆盖各种方法,包括ArrayAdaptergetItem方法。现在,您可以从getItem方法返回整个映射对象,并使用Activity或Fragment类中的getItemId方法简单地获取ListView的所选项的对象。获得对象后,您可以轻松访问该ID。

您可以找到自定义适配器here

的一个很好的示例和说明

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

答案 1 :(得分:0)

有很多解决方法。

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

即执行"SELECT id FROM mytable"

然后存储在arraylist中并使用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);}

答案 2 :(得分:0)

在这里,你可以用这个替换你的代码类,我添加了一个cursorAdapter并将它与你的ListView相连,在适配器中我添加了一个方法来获取我从Click监听器调用的id来从光标中检索id,你必须在public void getId(int position)以下的MyCursorAdapter类中为_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;
    }
}

由于代码未经测试,您可能在启动时遇到构建问题,但它应该知道代码中发生了什么。如果您在汇编中遇到任何问题,请随时提出任何问题