2011-11-01 84 views
0

問題,我發現這裏:Android的,我使用的是自定義列表視圖的自定義列表視圖

http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_9.html

似乎是有效的在Eclipse中,並期待在預覽選項卡好。這只是一個在底部有一個按鈕的列表視圖。所以我增加一條,作爲R.layout.buttonlist

<Button android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:id="@+id/testbutton" 
     android:text="@string/hello" android:layout_alignParentBottom="true" /> 

    <ListView android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:id="@+id/list" 
     android:layout_alignParentTop="true" android:layout_above="@id/testbutton" /> 

</RelativeLayout> 

不幸的是,當我運行它,我得到一個彈出窗口,上面寫着Android已經unexpecitdly關閉:

setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data)); 

當我嘗試使用內置列表視圖:

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data)); 

一切工作正常。我沒有看到logcat中的任何錯誤或警告,所以我不知道如何查明問題。有沒有人有任何想法?由於

編輯:添加活性

public class TestActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     List<String> data = new ArrayList<String>(); 
     data.add("hello"); 
     data.add("world"); 
     setContentView(R.layout.buttonlist); 
     //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data)); 
    } 
} 

回答

1

Hoofamon,我想在這裏糾正你。您不是創建自定義ListView,而是使用ListView創建自定義佈局。另外,我相信你還沒有完全理解setListAdapter在這裏做什麼。

這行代碼告訴listview消耗'android.R.layout.simple_list_item_1'作爲其佈局的內容。此佈局在Android SDK中預先定義。它只包含listview中每個項目的文本。第三個屬性'數據'指示每個列表視圖項目的內容。

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data)); 

所以,麥克L.曾建議,如果你的目的是要與純文本(具有默認格式)列表視圖,然後線之上會達到目的很好。您可以使用

setContentView(R.layout.buttonlist); 

設置「R.layout.buttonlist」作爲活動的佈局然而,如果你計劃包括在ListView附加內容(讀取圖像),或者想改變造型該文本,你將不得不爲listview定義一個自定義佈局。如果您想知道如何完成這項工作,我們可以將您引導至適當的來源。

EDIT加載數據的一種可能的方式爲正常的ListView

測試活動。java的

public class TestActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.buttonlist); 

     List<String> data = new ArrayList<String>(); 
     data.add("hello"); 
     data.add("world"); 


     ListView mListView = (ListView)findViewById(R.id.list); 

     mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data)); 

    } 
} 

buttonlist.xml

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

    <Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/testbutton" 
    android:text="@string/hello" 
    android:layout_alignParentBottom="true" /> 

    <ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/list" 
    android:layout_alignParentTop="true" 
    android:layout_above="@+id/testbutton" /> 

</RelativeLayout> 

這是應該看起來像在模擬器上:ListView

+0

謝謝對於答覆,不幸的是,當我嘗試setContentView(R.layout.buttonlist);正如你所建議的,我仍然會得到同樣的錯誤。我編輯了我的原始帖子,以包含有用的活動。即使您提出的方法有效,我仍然想知道如何將數據添加到此? – Hoofamon

+2

請看編輯!如果沒有具體的理由你爲什麼要擴展ListActivity,那麼我建議擴展一個活動,因爲兩者之間的差異不顯着 – Abhijit

+0

非常感謝Abhijit,這個作品奇妙! – Hoofamon

1

我不認爲你可以在適配器的佈局列表視圖。傳入的佈局應該只是在列表視圖中描述一行。所以buttonlist應該只包含按鈕的xml。該列表視圖需要位於單獨的佈局文件中。如果這是一個列表活動,那麼你不需要另一個佈局文件,就像你在做的那樣調用setListAdapter。

1

如果你想用你的R.layout.buttonlist填寫你可以這樣做(你的TestActivity應該擴展Activity而不是ListActivity):

public void onCreate(Bundle savedInstanceState){ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.buttonlist); 

    String data[]=new String[]{"Item_1","Item_2","Item_3"} 
    Button b=(Button)findViewById(R.id.testbutton); 
    ListView lv=(ListView)findViewById(R.id.list); 

    ArrayAdapter aa=new ArrayAdapter(context,android.R.layout.simple_list_item_1, data); 
    lv.setAdapter(aa); 

    //Your code... 
} 

現在如果你想創建自定義列表項顯示在列表視圖,那麼你需要做的是這樣的:

  1. 創建自定義列表項的XML文件。

    例:custom_listitem.xml

    <ImageView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:id="@+id/icon" 
        /> 
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent" 
        android:id="@+id/text" 
        /> 
    

  2. 創建自定義ArrayAdapter:

    例。 CustomArrayAdapter.class

    public class CustomArrayAdapter extends ArrayAdapter<String> { 
    
    String[] array; 
    LayoutInflater mInflater; 
    
    public CustomArrayAdapter(Context context, int textViewResourceId, 
         String[] objects) 
    { 
        super(context, textViewResourceId, objects); 
        array=objects; 
        mInflater = LayoutInflater.from(context); 
    } 
    
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    {  
        final ViewHolder holder; 
    
        if(convertView==null) 
        { 
          convertView = mInflater.inflate(R.layout.custom_listitem, null); 
          holder = new ViewHolder(); 
    
          holder.text=(TextView)convertView.findViewById(R.id.text); 
          holder.img=(ImageView)convertView.findViewById(R.id.icon); 
          convertView.setTag(holder); 
        } 
        else 
          holder=(ViewHolder)convertView.getTag(); 
    
        holder.text.setText(array[position]); 
    
        if(position==0) 
         holder.img.setImageResource(R.drawable.img1); 
        else if(position==1) 
         holder.img.setImageResource(R.drawable.img2); 
        else if(position==2) 
         holder.img.setImageResource(R.drawable.img3); 
    
        return convertView; 
    } 
    
    static class ViewHolder 
    { 
        TextView text; 
        ImageView img; 
    } 
    } 
    
  3. 使用在主活動這個自定義適配器類,以填補列表視圖:

    可以肯定,這主要活動延伸活動,而不是ListActivity

    super.onCreate(savedInstanceState); 
    
    setContentView(R.layout.main); 
    context=getApplicationContext(); 
    lv=(ListView)findViewById(R.id.listview); 
    
    CustomArrayAdapter aa=new CustomArrayAdapter(context,R.layout.custom_listitem, new String[]{"item_1","item_2","item_3"}); 
    
    lv.setAdapter(aa); 
    
          // other lines of code 
          . 
          . 
          .