Android初学者在这里。我正在玩ListViews,尝试动态创建它们而不是XML文件。我在代码中观察到以下奇怪的行为。
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 :(得分:6)
更改您的代码:
ll.addView(lv);
到此:
ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
问题解决了,我想,你必须给listview一些布局限制或定义,这样才能正常工作。
答案 1 :(得分: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);
}
}