我有一个列表视图,其中包含一些我从网上获得的数据。现在我可以对列表项进行更改,并且一旦对该项进行了更改,我将更新后的值存储在数据库中。当我下次登录应用程序时,我正在从net上下载内容,并在上次显示的列表视图中显示上次所做的更改。所以我的方法是,我正在查询列表适配器的getview方法中的每个项目的db以检查更改。对适配器的每个项目的getview方法执行数据库查询是否是一种好的做法?如果不是,你可以给我一些建议吗?谢谢。从列表适配器访问数据库
回答
永远,真的,永远不会那样做。
如果您将数据下载代码放在适配器的getView方法中,它将为列表的每一行进行网络调用。
甚至最糟糕的是,它会在屏幕上出现该行时随时调用该行,而不仅仅是一次行。
您应该首先获取所有数据,然后仅使用适配器绘制它。
您可以随时调用数据库来检查更改,并在必要时通知适配器重新绘制列表以显示更改。
希望这会有所帮助。
嗯,我没有从getView进行网络调用。它只有Sqlite数据库查询。从数据库获取行。 – Vyshakh
在Android开发中,任何时候想要显示项目的垂直列表时,都希望使用ListView,该ListView使用适配器填充到数据源。当我们希望列表的数据直接来源于SQLite数据库查询时,我们可以使用CursorAdapter。
的CursorAdapter的装配在一个光标(从SQLite的查询数据源)和ListView的(可视表示)之间,并且配置两个方面:
- 哪个布局模板充气一个项目
- 光标哪些字段绑定到视图模板
铬吃视图模板
当我们想要使用项目的自定义表示将一系列项目显示到列表中时,我们需要为每个项目使用我们自己的自定义XML布局模板。我们可以简单地在res/layout/item_todo.xml
创建一个XML布局模板代表一个特定的游标行:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Study cursors"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvPriority"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="3"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
定义适配器
public class ViewAdapter extends BaseAdapter {
LayoutInflater mInflater;
public ViewAdapter() {
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return favoriteList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listitem,null);
}
final TextView nameText = (TextView) convertView.findViewById(R.id.nameText);
nameText.setText("Name : "+favoriteList.get(position).getName());
final TextView ageText = (TextView) convertView.findViewById(R.id.ageText);
ageText.setText("Age : "+favoriteList.get(position).getAge());
final Button edit = (Button) convertView.findViewById(R.id.edit);
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.row);
dialog.setTitle("Add Data to Database");
final EditText name = (EditText) dialog.findViewById(R.id.name);
final EditText age = (EditText) dialog.findViewById(R.id.age);
Button Add = (Button) dialog.findViewById(R.id.Add);
Add.setText("Add");
Add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(name.getText().toString() != null && name.getText().toString().length() >0){
if(age.getText().toString() != null && age.getText().toString().length() >0){
db.updateRow(favoriteList.get(position).getId(), name.getText().toString(), age.getText().toString());
favoriteList = db.getFavList();
listView.setAdapter(new ViewAdapter());
dialog.dismiss();
}else{
Toast.makeText(getApplicationContext(), "Please Enter the Age", Toast.LENGTH_LONG).show();
}
}else{
Toast.makeText(getApplicationContext(), "Please Enter the Name", Toast.LENGTH_LONG).show();
}
}
});
dialog.show();
}
});
final Button delete = (Button) convertView.findViewById(R.id.delete);
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
db.removeFav(favoriteList.get(position).getId());
notifyDataSetChanged();
favoriteList = db.getFavList();
listView.setAdapter(new ViewAdapter());
}
});
return convertView;
}
}
创建数据库
DatabaseHandler.java
public class DatabaseHandler extends SQLiteOpenHelper {
//Database Version
private static final int DATABASE_VERSION = 1;
//Database Name
private static final String DATABASE_NAME = "Test";
//Table Name
private static final String TABLE_TEST = "TestTable";
//Column Name
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_AGE = "age";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//Create Table
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_TEST + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_AGE + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TEST);
onCreate(db);
}
//Insert Value
public void adddata(Context context,String movieId,String songId) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, movieId);
values.put(KEY_AGE, songId);
db.insert(TABLE_TEST, null, values);
db.close();
}
//Get Row Count
public int getCount() {
String countQuery = "SELECT * FROM " + TABLE_TEST;
int count = 0;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
if(cursor != null && !cursor.isClosed()){
count = cursor.getCount();
cursor.close();
}
return count;
}
//Delete Query
public void removeFav(int id) {
String countQuery = "DELETE FROM " + TABLE_TEST + " where " + KEY_ID + "= " + id ;
SQLiteDatabase db = this.getReadableDatabase();
db.execSQL(countQuery);
}
//Get FavList
public List<FavoriteList> getFavList(){
String selectQuery = "SELECT * FROM " + TABLE_TEST;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
List<FavoriteList> FavList = new ArrayList<FavoriteList>();
if (cursor.moveToFirst()) {
do {
FavoriteList list = new FavoriteList();
list.setId(Integer.parseInt(cursor.getString(0)));
list.setName(cursor.getString(1));
list.setAge(cursor.getString(2));
FavList.add(list);
} while (cursor.moveToNext());
}
return FavList;
}
}
Enojoys ....:)
最好使用游标适配器来绑定列表视图。即使数据库中存在更改,也可以使用Loader来更新列表。 加载程序回调的onLoadFinished(加载程序加载程序,D数据)将监视数据的更改,并通过新的调用向您报告。你不应该自己监控数据。
- 1. ZF2 - 访问控制器中的数据库适配器
- 2. 从列表适配器访问子视图
- 3. 从适配器Java代码访问UserIdentity
- 4. 访问数据库的用户列表
- 5. 从PlayFramework访问数据库管理器
- 6. Cakephp:从视图访问数据库表
- 7. 从列表适配器调用viewpager适配器
- 8. symfony数据库访问配置问题
- 9. ASP.NET - 更新数据集表适配器以匹配数据库数据类型
- 10. Android列表适配器问题
- 11. 可扩展列表适配器问题
- 12. android - 列表适配器问题
- 13. 自定义列表适配器问题
- 14. Geddy的数据库适配器
- 15. Digi ConnectPort数据库适配器
- 16. ZF3多个数据库适配器
- 17. JRuby的公共数据库适配器
- 18. ruby的数据库抽象/适配器
- 19. 从适配器刷新列表视图
- 20. 阵列适配器问题
- 21. 如何访问从一个活动列表适配器创建UI元素?
- 22. 从下拉列表中插入日期到访问数据库
- 23. 从sqlite数据库访问数据
- 24. 从sqlite数据库访问数据?
- 25. 从数据库访问数据
- 26. 从数据适配器填充数据表时发生错误
- 27. 如何访问RecyclerView适配器的ViewHolder的数据源?
- 28. 从简单的列表适配器来定制阵列适配器
- 29. Magento数据库访问配置
- 30. 列表视图适配器
我不认为从适配器访问数据库是一个好主意。考虑实现一个接口。 –
因此,您可以在线访问数据库信息,并且可以在本地进行与在线数据库同步的更改,但其他人可以更改在线数据库,因此您需要在登录时检查这些数据。 –
不,我在线获取数据,进行更改并将它们存储在sqlite设备数据库中。 – Vyshakh