2012-06-12 9 views
5

Początkujący Android tutaj. Grałem z ListViews, próbując utworzyć je dynamicznie zamiast pliku XML. Obserwuję następujące dziwne zachowanie w moim kodzie.Tworzenie ListView programowo

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

} 


} 

Zasadniczo najpierw utworzę obiekt LinearLayout, a następnie utworzę obiekt ListView jako jedno z jego elementów podrzędnych. Zauważyłem, że tak utworzone elementy listy nie są klikalne. Ale jeśli piszę

setContentView(lv); 

zamiast

setContentView(ll); 

elementy listy są klikalne. Czy ktoś może to wyjaśnić? Jak sprawić, aby elementy listy były klikalne, jeśli będę musiał zaimplementować moją klasę w ten sam sposób? Nie chcę iść drogą 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

Twój kod wygląda dobrze, nawet skompilowałem się, aby się upewnić, ale OnItemClickListener jest wykonywany zgodnie z obietnicą ... – Sam

+0

Co się stanie, jeśli ustawisz widok treści, a następnie dodasz listvieww? – Barak

+0

Nie, nadal nie działa. Lista wyświetla się dobrze, ale elementy listy są nie do kliknięcia. – VJune

Odpowiedz

6

zmienić kod:

ll.addView(lv); 

do tego:

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

Problem rozwiązany, myślę, trzeba dać ListView jakieś ograniczenia układu lub definicji, aby mogła działać poprawnie.

+0

hmm ... działa, ale określenie szerokości i wysokości dziecka Widok równy -1 jest nieco dziwny. Nie sądzisz? – VJune

+0

Dlaczego dziwne? -1 oznacza View.FILL_PARENT, myślę, że jest to uzasadnione. Przepraszam, może nie wyjaśniłem, możesz napisać tak: ll.addView (lv, View.FILL_PARENT, View.FILL_PARENT); –

+0

ok teraz widzę ... dzięki :) – VJune

2

udało mi się uzyskać to do pracy, ale musiałem stworzyć LinearLayout w formacie XML, który zdaję sobie sprawę, jest inna niż jak masz. Jednakże, biorąc pod uwagę, że tak czy inaczej LinearLayout jest elementem głównym, i biorąc pod uwagę, że wciąż programujesz program ListView, to naprawdę nie powinno to być różnicą IMHO.

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

Moje pytanie było bardziej przeznaczone na zrozumienie zachowania mojego programu. Sądziłem, że alternatywne implementacje na pewno istnieją. Ale dzięki za twoją odpowiedź. – VJune

Powiązane problemy