2012-07-26 4 views
11

Ich habe ein Problem stolperte ich kann nicht ganz meinen Kopf herum, so hoffte ich vielleicht jemand hier hatte das gleiche Problem oder wusste eine gute Möglichkeit, das Problem zu lösen .Verwenden Array-Adapter mit mehr Ansichten in Zeile in der Listenansicht

Ich habe eine Ansicht erstellt, die eine ListView enthält. Diese ListView enthält zwei TextView. Das Problem ist, dass ich nicht weiß, wohin ich die Werte, die in der zweiten Textansicht mit dem ArrayAdapter gehen sollen, sende. Gibt es eine Möglichkeit, weitere Informationen an den ArrayAdapter zu senden, damit ich das TextView "todaysmenu" füttern kann?

Die ArrayAdapter Methode:

private void createList() { 
    ListView lv = (ListView) findViewById(R.id.mylist); 
    String[] values = new String[] { "Android", "Linux", "OSX", 
      "WebOS", "Windows7", "Ubuntu", "OS/2" 
    }; 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowlayout, R.id.restaurantname, values); 
    lv.setAdapter(adapter); 
} 

Die Reihe Markup:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@+id/restaurantname" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@+id/todaysmenu" /> 

</LinearLayout> 

Die Aktivität Layout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
    android:id="@+id/mylist" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    </ListView> 


</LinearLayout> 

Am Anfang habe ich alles an die Arbeit, aber wenn ich hinzugefügt das zweite Textfeld Probleme entstehen. Im Voraus, danke für Ihre Hilfe!

Antwort

21

Um dies zu erreichen, müssen Sie einen benutzerdefinierten Adapter erstellen und Ihr benutzerdefiniertes Zeilenlayout aufblasen. Mit ArrayAdapter wird nicht funktionieren, weil

standardmäßig erwartet, dass diese Klasse, dass die Ressource-ID versehen Referenzen einen einzelnen Textview. Wenn Sie ein komplexeres Layout verwenden möchten, verwenden Sie die Konstruktoren, die auch eine Feld-ID verwenden. Diese Feld-ID sollte auf eine TextView in der größeren Layout-Ressource verweisen.

So könnte Ihre kundenspezifische Adapter-Klasse sein somthing wie:

public class CustomAdapter extends ArrayAdapter { 
    private final Activity activity; 
    private final List list; 

    public CustomAdapter(Activity activity, ArrayList<Restaurants> list) { 
     this.activity = activity; 
     this.list = list; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = convertView; 
     ViewHolder view; 

     if(rowView == null) 
     { 
      // Get a new instance of the row layout view 
      LayoutInflater inflater = activity.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.rowlayout, null); 

      // Hold the view objects in an object, that way the don't need to be "re- finded" 
      view = new ViewHolder(); 
      view.retaurant_name= (TextView) rowView.findViewById(R.id.restaurantname); 
      view.restaurant_address= (TextView) rowView.findViewById(R.id.textView1); 

      rowView.setTag(view); 
     } else { 
      view = (ViewHolder) rowView.getTag(); 
     } 

     /** Set data to your Views. */ 
     Restaurants item = list.get(position); 
     view.retaurant_name.setText(item.getTickerSymbol()); 
     view.restaurant_address.setText(item.getQuote().toString()); 

     return rowView; 
    } 

    protected static class ViewHolder{ 
     protected TextView retaurant_name; 
     protected TextView restaurant_address; 
    } 
} 

Und Ihre Restaurant.java Klasse könnte so einfach, wie ich unten beschreiben:

public class Restaurants { 
    private String name; 
    private String address; 

    public Restaurants(String name, String address) { 
     this.name = name; 
     this.address = address; 
    } 
    public void setName(String name) { 
     this.name= name; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setAddress(String address) { 
     this.address= address; 
    } 
    public String getAddress() { 
     return address; 
    } 
} 

nun in Sie Hauptaktivität binden Sie nur Liste mit einigen Daten, wie;

/** Declare and initialize list of Restaurants. */ 
ArrayList<Restaurants> list = new ArrayList<Restaurants>(); 

/** Add some restaurants to the list. */ 
list.add(new Restaurant("name1", "address1")); 
list.add(new Restaurant("name2", "address2")); 
list.add(new Restaurant("name3", "address3")); 
list.add(new Restaurant("name4", "address4")); 
list.add(new Restaurant("name5", "address5")); 
list.add(new Restaurant("name6", "address6")); 

An dieser Stelle Sie den benutzerdefinierten Adapter auf Ihrer Liste zu setzen sind in der Lage

ListView lv = (ListView) findViewById(R.id.mylist); 

CustomAdapter adapter = new CustomAdapter(YourMainActivityName.this, list); 
lv.setAdapter(adapter); 

Das alles ist, und es sollte nicelly arbeiten, aber ich empfehle Ihnen dringend, für einige bessere Alternativen zu Google implementieren Sie andere Adapters.

+0

Danke. Das hat geholfen! Vielen Dank. – olovholm

2

Sie könnten dies https://devtut.wordpress.com/2011/06/09/custom-arrayadapter-for-a-listview-android/ versuchen. Sie müssen ein benutzerdefiniertes Klassenelement mit den benötigten Feldern erstellen und ArrayAdapter erweitern.

+0

Vielen Dank für Ihren Vorschlag. – olovholm

+0

Die Lösung von dem Link, den Sie vorgeschlagen haben, funktionierte gut für mich. Vielleicht sollten Sie den Code kopieren und in Ihre Antwort einfügen und auf die URL verweisen, falls der Blog gelöscht wird. – Peter

0

Ich denke, dass Ihr Problem hier ist:

Statt dessen:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@+id/restaurantname" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@+id/todaysmenu" /> 

</LinearLayout> 

so etwas wie dieses Versuchen:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="test text" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="test text" /> 

</LinearLayout> 

Wenn das funktioniert, dann legen Sie Ihren Text in der Datei/res/val/string Ordner wie folgt:

<string name="testText">Put your text here...</string> 

und dann wie folgt aufrufen:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/testText" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/testText" /> 

</LinearLayout> 

Sie würden dann die dynamischen Werte wie folgt festgelegt:

TextView tv = (TextView)findViewById(R.id.restaurantname); 
tv.setText(values); 
+0

Vielen Dank für Ihren Vorschlag, aber ich habe stattdessen einen ArrayAdapter verwendet. Die Art der Änderung von Textwerten wird jedoch notiert. Vielen Dank. – olovholm

0

Ich hatte das gleiche Problem zu lösen und versucht, die arrayadapter zu verwenden, wie hier oben beantwortet, aber es hat nicht funktioniert.

Später gelang es mir, es mit baseadapter zu tun - das ist der Adapter:

public class BusinessAdapter2 extends BaseAdapter { 
    private final ArrayList<Business> myList; 
    LayoutInflater inflater; 
    Context context; 


    public BusinessAdapter2(Context context, ArrayList<Business> myList) { 
     this.myList = myList; 
     this.context = context; 
     inflater = LayoutInflater.from(this.context); 
    } 
    @Override 
    public int getCount() { 
     return myList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return myList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView==null) convertView = inflater.inflate(R.layout.business_list_item_2, parent, false); 
     // assign the view we are converting to a local variable 
     View v = convertView; 
     Business b = myList.get(position); 
     if (b != null) { 
      TextView name = (TextView) v.findViewById(R.id.textview_name); 
      TextView address = (TextView) v.findViewById(R.id.textview_address); 
      TextView description = (TextView) v.findViewById(R.id.textview_description); 
      TextView discount = (TextView) v.findViewById(R.id.textview_discount); 

      // check to see if each individual textview is null. 
      // if not, assign some text! 
      if (name != null){ 
       name.setText(b.name); 
      } 
      if (address != null){ 
       address.setText(b.address); 
      } 
      if (description != null){ 
       description.setText(b.description); 
      } 
      if (discount != null){ 
       discount.setText(b.discountRate); 
      } 
     } 

     // the view must be returned to our activity 
     return v; 
    } 
} 

dies der Object-Klasse I (Business) verwendet:

public class Business { 
    String name,address,description,discountRate; 
    public Business(){} 
    public Business(String name,String address,String description,String discountRate){ 
     this.name=name; 
     this.address=address; 
     this.description=description; 
     this.discountRate=discountRate; 
    } 
} 

und das ist, wie ich bevölkern Die Listenansicht in den Adapter:

ArrayList<Business> businesses2=new ArrayList<Business>(Arrays.asList(for_listview_objects)); 
    adapter_objects =new BusinessAdapter2(
      context, // The current context (this activity) 
      businesses2); 

    listView.setAdapter(adapter_objects);