2012-05-02 47 views
0

從html/php/css開始進行Android編程,我已經在網上搜索了一種簡單的方法來將我的代碼與我的樣式分開 - 現在我需要在列表視圖或表格視圖中顯示數據庫中的數據。Android:我應該用哪種方式將代碼與風格分開?

簡而言之,我從數據庫中獲取一個遊標,遍歷它,在代碼中動態創建每個列表項作爲TextViews。然後,我想從外部xml佈局文件將樣式應用到每個項目。

僞代碼:

style.xml:

// myStyle的:粗體,12磅

// yourstyle:斜體,11磅

活動:

for (each cursor-entry) 
{ 
    tv1 = new TextView(); 
    applyStyle(tv, mystyle); 

    tv2 = new TextView(); 
    applyStyle(tv, yourstyle); 

    //Apply content to textviews from the cursor... 
} 
mainLayout.setView(tv1); 
mainLayout.setView(tv2); 

我在網上找到的代碼示例使用多行代碼或多個xml文件(使用inflate或cursorAdapter),並且IMO很快變得臃腫。我只想要一個很好的方式來將樣式應用到動態創建的代碼。這可能嗎?

回答

0

如果您使用的是ListView,那麼擁有一個用於行的XML文件非常簡單。唯一需要的是一個XML文件和一個Adapter類。看看這個簡單的例子:

要讀取數據庫中的數據,創建一個輔助類是這樣的:

public class MessagingDatabaseAdapter { 
    protected SQLiteDatabase database; 

    public MessagingDatabaseAdapter(Context context) { 
     MessagingDatabaseHelper databaseHelper = new MessagingDatabaseHelper(context, "message_history_db"); 
     database = databaseHelper.getWritableDatabase();   
    } 

    public void close() { 
     database.close(); 
    } 

    public void Entity[] getAllEntities() { 
     Entity[] values = null; 
     String query = "select * from TABLE_NAME"; 
     Cursor cursor = null; 
     try { 
      cursor = database.rawQuery(query, null); 
      if(cursor.moveToFirst()) { 
       int s = cursor.getCount(); 
       values = new Entity[s]; 
       do { 
        Entity entity = new Entity(); 
        entity.setSomeProperty(cursor.getInt(cursor.getColumnIndex(SOME_PROPERTY_COLUMN))); 
        values[i++] = entity; 
       } while(cursor.moveToNext()); 
      } 
     } catch(Exception ex) { 
     } finally { 
      if(cursor != null) { 
       cursor.close(); 
      }    
      return values; 
     } 
    } 

    protected class MessagingDatabaseHelper extends SQLiteOpenHelper { 

     public MessagingDatabaseHelper(Context context, String name) { 
      super(context, name, null, 1); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
     db.execSQL("Your SQL to create Tables"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     } 
    } 
} 

在你的Activity類:

MessagingDatabaseAdapter db = new MessagingDatabaseAdapter(); 
values = db.getAllEntities(); 
db.close(); 

list_view = (ListView) findViewById(R.id.list_view); 
ListAdapter adapter = new ListAdapter(this, values); 
list_view.setAdapter(adapter); 

而且ListAdapter類:

public class ListAdapter extends ArrayAdapter<Entity> { 
    final Context context; 
    final Entity[] values;  

    public ListAdapter(Context context, Entity[] values) { 
     super(context, R.layout.list_screen, values); 
     this.values = values; 
     this.context = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.list_view_item, parent, false); 

     TextView datetimeTextView = (TextView) rowView.findViewById(R.id.list_view_datetime_text_view); 
     datetimeTextView.setTypeface(someTypeFace); 
     return rowView; 
    }  
} 

和行佈局XML文件(list_view_item.xml):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/BorderedFrame" > 

    <TextView 
     android:id="@+id/inbox_list_view_datetime_text_view" 
     style="@style/MediumText" 
     android:layout_width="wrap_content" > 
    </TextView> 

</RelativeLayout> 
+0

兩個問題:如何使用我的光標創建'值'實體?此外,Listadapter類中的R.layout。*和R.id. *無法找到我的xml文件。 – LongInt

+0

已編輯。我添加了代碼來從SQLite數據庫中檢索數據。 –

+0

謝謝,要測試一下。 – LongInt

相關問題