以编程方式创建 ListView

5

我是一名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>

你的代码看起来很好,我甚至编译了一下以确保,但是OnItemClickListener按照预期执行... - Sam
如果您设置内容视图,然后添加ListView会发生什么? - Barak
不行,还是不起作用。列表显示正常,但列表项无法点击。 - VJune
2个回答

6
改变你的代码:
ll.addView(lv);

转换为:

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

问题已经解决了,你需要给列表视图添加一些布局限制或定义,这样它才能正常工作。


嗯...它能工作,但将子视图的宽度和高度设置为-1有点奇怪,你不觉得吗? - VJune
为什么是奇数?-1 表示 View.FILL_PARENT,我认为这很合理。抱歉,也许我没有表述清楚,你可以这样写:ll.addView(lv, View.FILL_PARENT, View.FILL_PARENT); - Ruobin Wang
小修正,我认为应该是LayoutParams.FILL_PARENT而不是View.FILL_PARENT。 - VJune
是的,你说得对,我已经更正了我的答案,以避免一些误导。 - Ruobin Wang

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);
}

}


我的问题更多是想了解程序的行为。我猜想肯定存在其他的实现方式。但是感谢你的回复。 - VJune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接