2011-01-09 10 views
1

Ich versuche, eine Liste mit einer benutzerdefinierten List Element Zelle auf eine vollständig programmatische Weise (ohne Verwendung von XML) zu erstellen. Ich laufe in den unteren Fehler. Nach mehreren Stunden der Suche im Internet schreibe ich dies als meine erste Frage zu Stack Overflow.

Schätzen Sie Ihre Eingaben auf dieser & irgendwelche Vorschläge, wie Android-Programmierung besser in den Griff, ohne die R mit * xml

Auf diesen Code ausgeführt wird, ich die folgenden Fehler:..

(Suspended (Ausnahme Ressourcen $ NotFoundException))

ListView.layoutChildren() Zeile: 1596

Listview (AbsListView) .onLayout (boolean, int, i nt, int, int) Zeile: 1112

Listview (Ansicht) .layout (int, int, int, int) Zeile: 6569

FrameLayout.onLayout (boolean, int, int, int, int) Linie 333 ...

Code::

public class MyList ListActivity erstreckt {

static final ArrayList<HashMap<String,String>> list = 
    new ArrayList<HashMap<String,String>>(); 

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

// CUSTOM LI ST

LinearLayout mainLayout=new LinearLayout(this); 
    ListView myListView=new ListView(this); 
    mainLayout.addView(myListView); 


    LinearLayout ListItemLayout=new LinearLayout(this); 
    TextView title = new TextView(this); 
    TextView author = new TextView(this); 
    TextView price = new TextView(this); 
    ListItemLayout.addView(title); 
    ListItemLayout.addView(author); 
    ListItemLayout.addView(price); 

    SimpleAdapter adapter = new SimpleAdapter(
     this, 
     list, 
     ListItemLayout.getId(), 
     new String[] {"title","author","price"}, 
     new int[] {ListItemLayout.getChildAt(0).getId(),ListItemLayout.getChildAt(1).getId(),ListItemLayout.getChildAt(2).getId()} 
    );  
    populateList(); 
    setListAdapter(adapter); 

} 

private void populateList() { 
    HashMap<String,String> map = new HashMap<String,String>(); 
    map.put("title", 
"Professional Android "); 
    map.put("author", "Meier"); 
    map.put("price", "$54.99"); 
    list.add(map); 
    map = new HashMap(); 
    map.put("title","Android 2"); 
    map.put("author", 
"Sayed"); 
    map.put("price", "$48.98"); 
    list.add(map); 
    } 

}

Antwort

1

Sie können das nicht tun. SimpleAdapter erfordert eine Ressourcen-ID aus einem in xml definierten Layout. Es erfordert auch die Ressourcen-IDs der TextView s, die es bevölkern wird. Der Grund dafür ist, dass LayoutInflater#inflate verwendet wird, um das enthaltende View und dann ViewGroup#findViewById zu erstellen, um den Verweis auf die TextView s zu erhalten, die die Daten anzeigen wird.

Wenn Sie alle Ihre Layout in Code einschließlich der der Adapter tun möchten, müssen Sie Ihre eigene benutzerdefinierte Adapter Klasse erstellen. Sie können dies tun, indem Sie BaseAdapter verlängern und getView auf ein Minimum überschreiben.

+0

Arbeitete perfekt nach dem Erstellen eines benutzerdefinierten Adapters. Danke Qberticus! – dmg

0

Der Konstruktor Ihrer SimpleAdapter erfordert eine ID von Ihrem ListItemLayout aber es muss nicht ein (Ich denke, das Android fallen zurück, um die R-Datei zu überprüfen ist), so weisen sie eine ID in deinem Code.

+0

SetId für ListItemLayout und TextViews hinzugefügt. Wird immer noch der gleiche Fehler angezeigt. LinearLayout ListItemLayout = new LinearLayout (this); ListItemLayout.setId (1002); TextView-Titel = neuer TextView (this); title.setId (1003); TextView-Autor = neuer TextView (this); autor.setId (1004); TextView-Preis = neuer TextView (this); price.setId (1005); ListItemLayout.addView (Titel); ListItemLayout.addView (Autor); ListItemLayout.addView (Preis); – dmg

Verwandte Themen