1

我有一个列表视图,其中包含一些我从网上获得的数据。现在我可以对列表项进行更改,并且一旦对该项进行了更改,我将更新后的值存储在数据库中。当我下次登录应用程序时,我正在从net上下载内容,并在上次显示的列表视图中显示上次所做的更改。所以我的方法是,我正在查询列表适配器的getview方法中的每个项目的db以检查更改。对适配器的每个项目的getview方法执行数据库查询是否是一种好的做法?如果不是,你可以给我一些建议吗?谢谢。从列表适配器访问数据库

+0

我不认为从适配器访问数据库是一个好主意。考虑实现一个接口。 –

+0

因此,您可以在线访问数据库信息,并且可以在本地进行与在线数据库同步的更改,但其他人可以更改在线数据库,因此您需要在登录时检查这些数据。 –

+0

不,我在线获取数据,进行更改并将它们存储在sqlite设备数据库中。 – Vyshakh

回答

2

永远,真的,永远不会那样做。

如果您将数据下载代码放在适配器的getView方法中,它将为列表的每一行进行网络调用。

甚至最糟糕的是,它会在屏幕上出现该行时随时调用该行,而不仅仅是一次行。

您应该首先获取所有数据,然后仅使用适配器绘制它。

您可以随时调用数据库来检查更改,并在必要时通知适配器重新绘制列表以显示更改。

希望这会有所帮助。

+0

嗯,我没有从getView进行网络调用。它只有Sqlite数据库查询。从数据库获取行。 – Vyshakh

0

在Android开发中,任何时候想要显示项目的垂直列表时,都希望使用ListView,该ListView使用适配器填充到数据源。当我们希望列表的数据直接来源于SQLite数据库查询时,我们可以使用CursorAdapter。

enter image description here

的CursorAdapter的装配在一个光标(从SQLite的查询数据源)和ListView的(可视表示)之间,并且配置两个方面:

  1. 哪个布局模板充气一个项目
  2. 光标哪些字段绑定到视图模板

铬吃视图模板

当我们想要使用项目的自定义表示将一系列项目显示到列表中时,我们需要为每个项目使用我们自己的自定义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 ....:)

0

最好使用游标适配器来绑定列表视图。即使数据库中存在更改,也可以使用Loader来更新列表。 加载程序回调的onLoadFinished(加载程序加载程序,D数据)将监视数据的更改,并通过新的调用向您报告。你不应该自己监控数据。