问题描述
||
我正在尝试在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即可。