2011-04-25 44 views
2

我需要怎麼改變我下面的代碼,用我自己的XML列表視圖的幫助。該項目在我的光標「標籤」,「標題」,&「詳細描述」需要被膨脹成itemLabel,itemTitle中,XML的& itemDiscription。任何幫助將不勝感激:我知道如何從一個簡單的數組做到這一點。我爲從數據庫中獲取數據而創建的活動效果很好 - 我只是不知道如何使用/顯示具有multilines的自定義lisView。日Thnx!ListView控件和定製的ListView

修訂:我設法獲取數據使用自己的自定義XML文件,從數據庫中顯示。我現在的問題是每個TextView都返回三個列。即:從數據庫中的列'標題','標籤','描述'都作爲一個連續的線膨脹成一個單獨的TextView。我無法弄清楚如何將它分解成正確的TextView; title = R.id.listTitle,label = R.id.label,描述應該膨脹到R.id.caption中。幫幫我!

的ListView的活動:(修訂版):

public class List_AC extends ListActivity { 

private ArrayList<String> results = new ArrayList<String>(); 

File dbfile = new File("/mnt/sdcard/XXX/XXX/dB/XXX.db"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    openAndQueryDatabase(); 
    displayResultList(); 
} 

private void displayResultList() { 
    AC_Adapter adapter = new AC_Adapter(getApplicationContext(),R.layout.list_item, results, results, results); 
    setListAdapter(adapter); 
} 

private void openAndQueryDatabase() { 
    try { 
     Cursor c = db.rawQuery("SELECT label, title, discription FROM AC_list", null); 
     if (c != null) { 
      if (c.moveToFirst()) { 
       do { 
        String i1 = c.getString(c.getColumnIndex("label")); 
        String i2 = c.getString(c.getColumnIndex("title")); 
        String i3 = c.getString(c.getColumnIndex("discription")); 
        results.add(i1 + i2 + i3); 
       } while (c.moveToNext()); 
      } 
     } 
    } catch (SQLiteException se) { 
     Log.e(getClass().getSimpleName(), 
       "Could not create or Open the database"); 
    } finally { 
     if (db != null) 
      db.close(); 
    } 
} 

}

添加的適配器(AC_Adapter.java):

public class AC_Adapter extends ArrayAdapter<String> { 
static List<String> Title = new ArrayList<String>(); 
static List<String> Label = new ArrayList<String>(); 
static List<String> Description = new ArrayList<String>(); 

Context myContext; 

public AC_Adapter (Context context, int resource, List<String> aTitle, List<String> aLabel, List<String> aDescription){ 

    super(context, resource, aTitle); 

    myContext = context; 
    Title= aTitle; 
    Label= aLabel; 
    Description = aDescription; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) myContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.list_item, null); 
    } 

    TextView tv_label = (TextView) v.findViewById(R.id.label); 
    TextView tv_title = (TextView) v.findViewById(R.id.listTitle); 
    TextView tv_decription = (TextView) v.findViewById(R.id.caption); 

    if (tv_label != null) { 
     tv_label.setText(Label.get(position)); 
    } 
    if (tv_title != null) { 
     tv_title.setText(Title.get(position)); 
    } 
    if (tv_decription != null) { 
     tv_decription.setText(Description.get(position)); 
    } 

    return v; 

} 

}

這是需要的XML要創建(list_view.xml)在OnCreate:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="30dip" 
    android:padding="4dip" 
    android:background="@drawable/gradient" > 

    <ImageButton 
     android:id="@+id/homeBtn" 
     android:src="@drawable/ic_menu_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:background="@null" /> 

    <TextView 
     android:id="@+id/titleBarTitle" 
     android:layout_centerInParent="true" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:textSize="18sp" /> 

    <ImageButton 
     android:id="@+id/toolBtn" 
     android:src="@drawable/ic_menu_list" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentRight="true" 
     android:background="@null" /> 

</RelativeLayout> 

<ListView 
    android:id="@+id/listItems" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" /> 

</LinearLayout> 

和列表項(list_item.xml):

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:id="@+id/itemLabel" 
    style="@style/listAcronym" /> 

<TextView 
    android:id="@+id/itemTitle" 
    style="@style/listTitle" /> 

<TextView 
    android:id="@+id/itemDiscription" 
    style="@style/listDiscription"/>   

<ImageView 
    style="@style/listNextIcon" /> 

回答

2

的基本過程是創建一個定製適配器其中將包含佈局R.layout .list_item

因此,更換這行setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, results)); 01在你的代碼通過

setListAdapter(new CustomAdapter(this,R.layout.list_item, results)); 

現在,您需要創建延伸ArrayAdapter或BaseAdapter一個CustomAdapter並重寫getView方法膨脹R.layout.list_item

請馬克·墨菲參閱本優秀教程 Custom ListView Adapter

如果您在嘗試此操作後還有任何疑問,請在此處張貼。

+0

我修改了上面的代碼-PLZ c REVISED在我的Q. Thx @chaitanya – CelticParser 2011-04-26 17:08:12

+0

你可能想要傳遞Activity而不是使用getApplicationContext(),你可以幫我一個忙,只需將你的項目壓縮併發送給我一個鏈接,我可以修復它並在這裏發佈答案。此外,使用活動的LayoutInflater而不是上下文 – chaitanya 2011-04-26 18:27:22

+0

Thx @chaitanya這裏是鏈接到zip。讓我知道你什麼時候有,所以我可以刪除這條評論。此外,我只發送了此活動的支持文件/結構。數據庫位於資產文件夾中,您必須手動將其放在仿真器SD卡下的「extStorageDirectory +」/xxx/xxx/dB/flyDroid.db「我必須從項目中省略儘可能多的數據,一些虛假的信息進入數據庫(這是一個政府項目)抱歉。提前感謝您的幫助 - 我有很多東西要學習...... – CelticParser 2011-04-26 19:41:02

2

一切都很好,只需添加一個類從ArrayAdapter延伸,做這樣的事情:

public class CustomAdapter extends ArrayAdapter<String> 
{ 
    List<String> Title= new ArrayList<String>(); 
    List<String> Label= new ArrayList<String>(); 


    Context myContext; 


public CustomAdapter (Context context, int resource, 
               int textviewresourceid, 
               List<String> aTitle, 
               List<String> aLabel) 
{ 


    super(context, resource,textviewresourceid,aType); 

    myContext = context; 
    Title= aTitle; 
    Label= aLabel; 



} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
    if (v == null) 
    { 
      LayoutInflater vi = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_view, null); 
    } 

    TextView tv_title = (TextView) v.findViewById(R.id.id_tv_Title); 
    TextView tv_Label= (TextView) v.findViewById(R.id.id_tv_Label); 


    if(tv_title != null) 
    { 
     tv_title.setText(Title.get(position)); 
    } 
    if(tv_Label != null) 
    { 
     tv_Label.setText(Label.get(position)); 
    } 

    return v; 


} 

然後使用這個適配器,如:

CustomAdapter adapter = new CustomAdapter(getAppContext(),R.layout.list_view,Textview Title Id,your lists...); 

setListAdapter(adapter); 

事情是這樣的....希望它可以幫助...

+0

首先我要感謝您 - 爲您快速回復:@Farhan和@chaitanya(對不起,我不能早點回復)我跟着你的建議,以及我知道如何和活動顯示w/o強制關閉或任何DDMS錯誤,但沒有數據返回(空白屏幕)我是我確定我有什麼不對的地方,所以如果你能看看,我會很感激的。我在上面的Q做了修改。Thnx。 – CelticParser 2011-04-26 15:02:33

+0

我修改了上面的代碼--PLZ c修改了我的Q. Thx @Farhan – CelticParser 2011-04-26 17:07:55

+0

一個錯誤:在適配器中傳遞結果3次,而你期待3個不同的列表...所以你爲什麼不打破水庫將其轉換爲3個差異列表並將其傳遞給適配器。 – Farhan 2011-04-26 18:40:21