2012-06-12 42 views
5

Android初學者在這裏。我在玩ListViews,試圖動態地創建它們而不是XML文件。我在我的代碼中觀察到以下奇怪的行爲。以編程方式創建ListView

public class SettingsHolder extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    LinearLayout ll = new LinearLayout(this); 
    ListView lv = new ListView(this); 
    String[] values = new String[10]; 
    for(int i=0;i<10;i++){ 
     values[i] = ""+i; 
    } 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, values); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      //Toast.makeText(getBaseContext(), ""+arg2,  Toast.LENGTH_SHORT).show(); 
      Log.d("DEBUG", ""+arg2); 

     } 

    }); 

    ll.addView(lv); 
    setContentView(ll); 

} 


} 

基本上我首先創建一個LinearLayout對象,然後將一個ListView對象作爲它的一個子對象。我發現這樣創建的列表項不可點擊。但是,如果我寫的

setContentView(lv); 

代替

setContentView(ll); 

列表項的點擊。任何人都可以解釋一下嗎?如果我必須以後一種方式實施我的課程,如何讓列表項目可點擊?我不想去ListActivity的方式。

list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 
+0

你的代碼看起來很好,我甚至編譯可以肯定,但OnItemClickListener按照承諾執行... – Sam

+0

如果設置內容視圖然後添加listvieww,會發生什麼? – Barak

+0

不,仍然不起作用。列表顯示正常,但列表項不可點擊。 – VJune

回答

6

更改代碼:

ll.addView(lv); 

這樣:

ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

問題解決了,我想,你必須給列表視圖某種佈局的限制或定義,所以它可以正常工作。

+0

嗯...它的作品,但使寬度和高度的兒童視圖等於-1有點奇怪。你不覺得嗎? – VJune

+0

爲什麼奇怪? -1意味着View.FILL_PARENT,我認爲這是合理的。對不起,也許我沒有說清楚,你可以這樣寫:ll.addView(lv,View.FILL_PARENT,View.FILL_PARENT); –

+0

好吧,我現在看到...謝謝:) – VJune

2

我能得到這個工作,但我不得不在XML創建的LinearLayout,我知道的是比你如何有它不同。然而,無論哪種方式,LinearLayout都是根元素,並且由於您仍然以編程方式創建ListView,所以它實際上應該沒有區別。

public class ExampleActivity extends Activity implements OnItemClickListener { 

private LinearLayout ll; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 
    ll = (LinearLayout) findViewById(R.id.main_ll); 
    ListView lv = new ListView(this); 
    ll.addView(lv); 

    String[] values = new String[10]; 
    for (int i = 0; i < 10; i++) { 
     values[i] = "" + i; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, values); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(this); 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    Toast.makeText(this, "" + arg2, Toast.LENGTH_SHORT).show(); 
    Log.d("DEBUG", "" + arg2); 
} 

}

+0

我的問題旨在更多地理解我的程序的行爲。我猜想替代實現肯定會存在。但是,謝謝你的回覆。 – VJune