2012-06-29 13 views
31

Böylece, satırların "birincil" metin görünümünün değerler dizisiyle doldurulduğu bir Liste Görünümü oluşturulur.Basit_list_item_2'yi kullanarak bir ListView'in iki satırını nasıl belirlenir?

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

Üçüncü parametrenin android.R.id.text2 olarak değiştirilmesi, "ikincil" metin görünümünü ayarlar. İkisini de ayarlamanın herhangi bir yolu var mı?

cevap

39

AFAIK simple_list_item_2, iki TextView içeren bir TwoLineListItem içerir. ArrayAdapter burada çalışmayacak, ya özel bir adaptör oluşturmanız ya da SimpleCursorAdapter gibi destekleyen birini kullanmanız gerekecek. Eğer SimpleCursorAdapter istemiyorsanız

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

Veya Özel ArrayAdapter oluşturmanız gerekir ya BaseAdapter

özel adaptöre diziyi (iki öğe olması) nesneyi, özel ArrayAdapter oluşturma uygulamak ve getListView.setAdapter için besleyin.

ArrayAdapter'ın getView yöntemini, özel diziler satır görünümünde ad dizgileri TextViews'a uygulamak için geçersiz kılın.

Aşağıdaki Snippet size yardımcı olacaktır.

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

/Person.Java' 'in belirleyiciler bu şeydir API kullanımdan kaldırıldı TwoLineListItem kullanımını yapmaz Google, performans rehberinde tavsiyede bulunur. – Fred

+8

@Fred Android'in Performans İpuçları sayfası, geliştiriciye, üye değişkenlerine erişen yöntemlere atıfta bulunduğu "İÇERLİ alıcılardan/belirleyicilerden" kaçınmasını önerir.Bu, dünyanın geri kalanıyla etkileşime geçmek için sınıflarınızı uygun arayüzlerle yazmamanız gerektiği anlamına gelmez. Ve aynı ipucu içinde, ProGuard'ın tüm noktalara hitap eden getçiler ve ayarlayıcıları inkar ettiğine de dikkat çekiyorlar. – spaaarky21

+0

Bu, hem gerekli bilgileri hem de koddaki çok pratik uygulamaları sağlayan mükemmel bir yanıttır. – LarsH

2

wel bu deneyebilirsiniz 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

Benim için çalışmadı, ama bu yaptı: http://www.sethgholson.com/2012/01/using-simple_list_item_2-with-an-arrayadapter-android/ – pstoppani

+0

Bu yanlış - 'convertView kullanmazsınız 'veya' parent' ... – Timmmm

+0

@Timmmm 'super.getView()' yöntemi bununla ilgilenir. –

93

Bu sorular Google ile yüksek sırada yer alıyor ancak verilen yanıtın çok karmaşık olduğunu düşünüyorum. other cevaplarında belirtildiği gibi, ArrayAdapter kullanarak çok kolay bir hile ile istenen işlevsellik elde edilebilir. Fark olmadıysa

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

:

Sen ArrayAdapter ait GetView yöntemini geçersiz kılabilir hile (esas olarak gereksizdir) parametre olarak android.R.id.text1 temin etmektir, aksi super çağrısı istisna neden olur .

Ayrıca, bu çözüm 17

+0

Bu işe yaradı! 'ArrayAdapter' öğesine geçen 'liste' değişkeni, hiçbir zaman gerçekten kullanılmaz. – Fred

+0

Evet, TwoLineListItem kullanımdan kaldırıldı ancak bunun bir şekilde Vipul örneğinde birlikte kullanılmaları nedeniyle SimpleCursorAdapter ile ilgili olduğunu sanmıyorum. SimpleCursorAdapter, belirli sütun görünümlerini verilen düzen görünümleriyle eşleştirerek, İmleç satırlarıyla yineleyen çok kullanışlı, genel bir ListAdapter uygulamasıdır. Bir İmleci ListView doldururken kendi ListAdapter yazma üzerine genellikle tercih edilmelidir. Yine de, bir İmleç kullanmıyor olsanız bile, bir SimpleCursorAdapter kullanmak ve verilerinizi bir MatrixCursor'a sarmak söz konusu olmayabilir. – spaaarky21

+0

Haklısınız, TwoLineListItem SimpleCursorAdapter ile ilgili değil. Ben sadece iki satırda iki satırda kullanılır çünkü açıklama dahil ettim. Benim çözümüm sadece basit, kısa listeler içindir. Daha gelişmiş çözümler örn. ViewHolder desenini de kullanın. – winne2

4

umut bu yardım

Sen alıcılar kullanmak
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; 
           } 

          }; 
İlgili konular