实现CursorAdapter以获得ListView中ListItem的DB rowID

问题描述

|| 我正在尝试在Android应用程序中实现CursorAdapter。我阅读了不同的教程,并尝试了不同的方法,但是它不起作用! 我在这里发现了一个与我的问题非常相似的问题,但我没有想到。 这是东西: 我有一个包含多个表和外键的数据库。我写了一个(经过测试并且可以正常工作的)数据库,其中包括 sqliteHelper类的扩展名才能正常工作。 DB类包含许多方法来进行各种操作 在该数据库上,例如:插入,更新,删除,更改和一些特殊需要。 我的问题如下: 我编写了一种方法,该方法返回要显示数据库中包含(所有行)的所有数据 在ListView中。返回的对象是包装的ArrayList>。我一切正常 与ListViewAdapter,但后来我遇到了问题,这几乎使我发疯: 用户应单击该特定列表中的随机项(包含数据库中的所有行),然后我要 使用用户放入EditText框中的一些新数据更新数据库中的特定行。其实很简单的任务,但我想我只是不了解CursorAdapter的用法。 我现在的问题: 我的DB方法必须返回什么(或看起来类似),CursorAdapter才能处理它。 我该如何实现仅完成一项任务的适配器(检索列表中数据库条目的正确rowID) 这是我从数据库中检索数据的方法
public ArrayList<ArrayList<Object>> getAll()
    {
        ArrayList<ArrayList<Object>> allRows = new ArrayList<ArrayList<Object>>();

        //Cursorobjekt haelt die Daten einer Zeile und dient dazu in diesen zu iterieren
        Cursor myCursor1,myCursor2,myCursor3;


        myCursor1 = db.query 
        (       \"Faecher\",new String[] { \"id\",FACH_NAME,FACH_ART },null,null
        );
        // Den Pointer an die erste Stelle ruecken
        myCursor1.movetoFirst();


        myCursor2 = db.query
        (
                \"Ort\",new String[]{\"id\",ORT_RAUM,ORT_GEBAEUDE},null
        );
        myCursor2.movetoFirst();



        myCursor3 = db.query
        (
                \"Profs\",PROFS_NAME,PROFS_SNAME,FKEY_GENDER_ID},null
        );
        myCursor3.movetoFirst();


        for(int i=0; i < myCursor1.getCount(); i++)
        {
            ArrayList<Object> row1 = new ArrayList<Object>();

            row1.add(myCursor1.getLong(0));
            row1.add(myCursor1.getString(1));
            row1.add(myCursor1.getString(2));
            row1.add(myCursor2.getLong(0));
            row1.add(myCursor2.getString(1));
            row1.add(myCursor2.getString(2));
            row1.add(myCursor3.getLong(0));
            row1.add(myCursor3.getString(1));
            row1.add(myCursor3.getString(2));
            row1.add(myCursor3.getLong(3));
            allRows.add(row1);

            myCursor1.movetoNext();
            myCursor2.movetoNext();
            myCursor3.movetoNext();
        }

        myCursor1.close();
        myCursor2.close();
        myCursor3.close();

        return allRows;
    }
适配器现在为空,因为我的代码是真正的废话,现在看起来像这样的外壳:
public class Subjectlistadapter extends CursorAdapter
{
    private LayoutInflater myInflater;


    public Subjectlistadapter(Context context,Cursor c) 
    {
        super(context,c);

    }

    @Override
    public View newView(Context context,Cursor myCursor,ViewGroup parent) 
    {

        return null;
    }

    @Override
    public void bindView(View parent,Context context,Cursor myCursor) 
    {


    }

}
我希望有人可以帮助我解决我的问题,或者给我提示我必须去哪里才能使它工作。     

解决方法

        如果我正确理解了您的问题,似乎您的主要问题是确定在适配器中单击了哪个元素。您可能需要从bindview和newview切换到仅使用getview。如果这样做,您可以在getView返回它之前将onClicklistener添加到视图中。这样,列表中的每一行都有其自己的侦听器,并且可以更新数据库中的正确行。 onClickListener运行正确的数据库更新方法所需的任何特定信息(即rowId)也可以通过视图上的Tag传递到侦听器中。希望能有所帮助。     ,        您必须从数据库创建一个大查询并获得一个Cursor。您甚至可以使用普通的sql选择,例如
String selectQuery = \"SELECT  id,\" FACH_NAME\",\"+ FACH_NAME \",\" + FACH_ART .... +\" FROM Faecher INNER JOIN ....\"; 
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery,null);
获得重新定位的光标。比使用getted游标创建自定义CursorAdapter
 public class ExampleCursorAdapter extends CursorAdapter {
                public ExampleCursorAdapter(Context context,Cursor c) {
                    super(context,c);
                }
@Override
            public void bindView(View view,Context context,Cursor cursor) {
                TextView something1 = (TextView)view.findViewById(R.id.something1);
                something1.setText(cusror.getString(0));
                        TextView something2 = (TextView)view.findViewById(R.id.something2);
                something1.setText(cusror.getString(1));
                        .......
                viev.addOnClickListener(new OnClickListener{
                     public void onClick(...){
                     }
                     });       
            }
@Override
            public View newView(Context context,Cursor cursor,ViewGroup parent) {
                LayoutInflater inflater = LayoutInflater.from(context);
                View v = inflater.inflate(R.layout.item,parent,false);
                return v;
            }
        }
方法Cursor的每个原始对象都会调用bindView(....)方法,但是将其设置为不同的位置,您可以在此方法内进行更改。只需通过setAdapter(....)方法将此适配器绑定到ListView即可。