2012-06-29 10 views
31

Zatem poniżej utworzy się ListView, gdzie wiersze mają swój "podstawowy" widok tekstowy wypełniony przez tablicę wartości.Jak ustawić obie linie ListView za pomocą simple_list_item_2?

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_2, android.R.id.text1, values); 

Zmiana trzeciego parametru na android.R.id.text2 powoduje ustawienie "dodatkowego" widoku tekstowego. Czy istnieje prosty sposób na ustawienie obu?

Odpowiedz

39

AFAIK simple_list_item_2 zawiera TwoLineListItem zawierający dwa TextViews. ArrayAdapter nie będzie tutaj działał, musisz albo utworzyć niestandardową kartę, albo użyć takiej, która obsługuje ją jak SimpleCursorAdapter.

ListAdapter adapter = new SimpleCursorAdapter(
       this, 
       android.R.layout.simple_list_item_2, 
       mCursor,  // Pass in the cursor to bind to. 
       new String[] {People.NAME, People.COMPANY}, // Array of cursor columns to bind to. 
       new int[] {android.R.id.text1, android.R.id.text2}); // Parallel array of which template objects to bind to those columns. 

     // Bind to our new adapter. 
     setListAdapter(adapter); 

Albo jeśli nie chcesz SimpleCursorAdapter Trzeba będzie tworzyć niestandardowe ArrayAdapter lub BaseAdapter

Tworzenie niestandardowego ArrayAdapter zastosować obiekt (o dwie pozycje) tablicę do adaptera niestandardowego, a podaj go do getListView.setAdapter.

Zastąp metodę getView metody ArrayAdapter, aby zastosować łańcuchy nazw do widoku TextView w widoku niestandardowego widoku listy.

Poniższy fragment pomoże Ci.

SampleActivity.java

package org.sample; 

import java.util.ArrayList; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
import android.widget.TwoLineListItem; 

public class SampleActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Person person; 

     ArrayList<Person> persons = new ArrayList<Person>(); 

     person = new Person(); 
     person.setName("Vipul"); 
     person.setAge(20); 
     persons.add(person); 

     person = new Person(); 
     person.setName("Anil"); 
     person.setAge(22); 
     persons.add(person); 

     setListAdapter(new MyAdapter(this, persons)); 
    } 

} 

Person.java

class Person { 
    String name; 
    int age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

} 

MyAdapter.java

class MyAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Person> persons; 

    public MyAdapter(Context context, ArrayList<Person> persons) { 
     this.context = context; 
     this.persons = persons; 
    } 

    @Override 
    public int getCount() { 
     return persons.size(); 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     TwoLineListItem twoLineListItem; 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      twoLineListItem = (TwoLineListItem) inflater.inflate(
        android.R.layout.simple_list_item_2, null); 
     } else { 
      twoLineListItem = (TwoLineListItem) convertView; 
     } 

     TextView text1 = twoLineListItem.getText1(); 
     TextView text2 = twoLineListItem.getText2(); 

     text1.setText(persons.get(position).getName()); 
     text2.setText("" + persons.get(position).getAge()); 

     return twoLineListItem; 
    } 
} 
+0

użyć pobierające/ustawiaczy w 'Person.Java' to jest coś Porady Google w przewodniku skuteczności. – Fred

+8

Strona z poradami dotyczącymi wydajności na stronie Android @ poleca programistom "unikanie programów pobierających/ustawiających WEWNĘTRZNE", dzięki którym wydają się odnosić do metod uzyskiwania dostępu do zmiennych członkowskich.To nie znaczy, że nie powinieneś pisać swoich klas z odpowiednimi interfejsami, z którymi reszta świata może wchodzić w interakcje. I w tym samym napiwku wskazują również, że ProGuard dodaje do siebie i pobiera setery, co czyni cały argument dyskusyjny. – spaaarky21

+0

To jest doskonała odpowiedź, zawierająca zarówno wymagane informacje, jak i bardzo praktyczne zastosowania w kodzie. – LarsH

2

może spróbować to jako wel l ....

adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_2,values){ 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent){ 

       TwoLineListItem row = (TwoLineListItem)super.getView(position, convertView, parent); 

       row.getText1().setText(values.get***()); 
       row.getText2().setText(values.get****()); 

       return row; 
      } 
     }; 
    setAdapter(adapter); 
+0

Nie działa dla mnie, ale to zrobiło: http://www.sethgholson.com/2012/01/using-simple_list_item_2-with-anrayadapter-android/ – pstoppani

+0

To jest złe - nie używasz 'convertView 'lub' parent' ... – Timmmm

+0

@ Timmmm metoda 'super.getView()' zajmuje się tym. –

93

To pytanie jest wysokie w Google, ale uważam, że podana odpowiedź jest zbyt skomplikowana. Jak wskazano w odpowiedziach other, pożądaną funkcjonalność można osiągnąć za pomocą ArrayAdapter z bardzo łatwą lewą ręką.

Można zastąpić metodę getView z ArrayAdapter:

ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_2, android.R.id.text1, list) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    TextView text1 = (TextView) view.findViewById(android.R.id.text1); 
    TextView text2 = (TextView) view.findViewById(android.R.id.text2); 

    text1.setText(persons.get(position).getName()); 
    text2.setText(persons.get(position).getAge()); 
    return view; 
    } 
}; 

Jeśli nie zauważył: Sztuką jest dostarczanie android.R.id.text1 (głównie jako parametr niepotrzebnych), w przeciwnym wypadku wywołanie super spowoduje wyjątek .

Ponadto, rozwiązanie to nie wykorzystują TwoLineListItem, która została zaniechana na API 17.

+0

Dziękuję, że działało! Jednak zmienna 'list' przekazywana do' ArrayAdapter' nigdy nie jest tak naprawdę używana. – Fred

+0

Tak, TwoLineListItem został wycofany, ale nie sądzę, że jest on w jakiś sposób powiązany z SimpleCursorAdapter, ponieważ został użyty razem w przykładzie Vipul. SimpleCursorAdapter jest bardzo użyteczną, ogólną implementacją ListAdapter, która iteruje za pomocą wierszy kursora, mapując podane kolumny do podanych widoków układu. Zasadniczo powinno to być preferowane przed pisaniem własnego ListAdaptera podczas zapełniania ListView z kursora. Chociaż, nawet jeśli nie używasz kursora, może nie być wykluczone użycie SimpleCursorAdapter i zawijanie danych w MatrixCursor. – spaaarky21

+0

Masz rację, TwoLineListItem nie jest powiązany z SimpleCursorAdapter. Uwzględniłem tę uwagę po prostu dlatego, że TwoLineListItem jest używany w dwóch innych odpowiedziach. Moje rozwiązanie dotyczy tylko prostych, krótkich list. Bardziej zaawansowane rozwiązania będą np. wykorzystaj również wzorzec ViewHolder. – winne2

4

nadzieja to pomóc

ArrayAdapter<CustomObject> adapter = new ArrayAdapter<CustomObject> (_context, android.R.layout.simple_list_item_2, android.R.id.text1, listCustomObject) { 

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

            TextView text1 = (TextView) view.findViewById(android.R.id.text1); 
            TextView text2 = (TextView) view.findViewById(android.R.id.text2); 

            text1.setText(listCustomObject.get(position).getText1()); 

            text2.setText(listCustomObject.get(position).getText2()); 

            return view; 
           } 

          }; 
Powiązane problemy