2012-06-29 48 views
31

Vì vậy, sau đây sẽ tạo ra một ListView nơi các hàng có textview "chính" của họ được lấp đầy bởi mảng giá trị.Làm thế nào để thiết lập cả hai dòng của một ListView sử dụng simple_list_item_2?

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

Thay đổi tham số thứ ba thành android.R.id.text2 đặt chế độ xem văn bản "phụ". Có cách nào đơn giản để đặt cả hai?

Trả lời

39

AFAIK simple_list_item_2 chứa một TwoLineListItem chứa hai TextView. ArrayAdapter sẽ không hoạt động ở đây, bạn sẽ phải tạo một adapter tùy chỉnh hoặc sử dụng một adapter hỗ trợ nó như 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); 

Hoặc nếu bạn không muốn SimpleCursorAdapter Bạn sẽ phải tạo Custom ArrayAdapter hoặc BaseAdapter

Tạo một ArrayAdapter tùy chỉnh, áp dụng các đối tượng (Có hai bài) mảng để adapter tùy chỉnh, và nạp nó vào getListView.setAdapter.

Ghi đè phương thức getView của ArrayAdapter để áp dụng các chuỗi tên của bạn cho TextViews trong chế độ xem hàng danh sách tùy chỉnh của bạn.

Đoạn mã sau sẽ giúp bạn.

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

Bạn sử dụng getters/setters trong 'Person.Java' đây là một cái gì đó Lời khuyên của Google chống lại trong hướng dẫn hiệu suất của họ. – Fred

+8

@Fred Android's Performance Tips trang khuyên nhà phát triển "tránh Getters/setters nội bộ", theo đó họ dường như đang đề cập đến các phương pháp truy cập vào biến thành viên.Điều đó không có nghĩa là bạn không nên viết các lớp của bạn với các giao diện thích hợp cho phần còn lại của thế giới để tương tác với. Và trong cùng một mẹo, họ cũng chỉ ra rằng ProGuard inline getters và setters, làm cho toàn bộ điểm tranh luận. – spaaarky21

+0

Đây là một câu trả lời xuất sắc, cung cấp cả thông tin được yêu cầu và các ứng dụng rất thực tế trong mã. – LarsH

2

có thể thử này như 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

Đã không làm việc cho tôi, nhưng điều này đã làm: http://www.sethgholson.com/2012/01/using-simple_list_item_2-with-an-arrayadapter-android/ – pstoppani

+0

Điều này là sai - bạn không sử dụng 'convertView 'hoặc' parent' ... – Timmmm

+0

@Timmmm phương thức 'super.getView()' xử lý điều đó. –

93

Câu hỏi này xếp hạng cao với Google nhưng tôi coi câu trả lời là quá phức tạp. Như đã chỉ ra trong câu trả lời other, chức năng mong muốn có thể đạt được bằng cách sử dụng ArrayAdapter với một mẹo rất dễ dàng.

Bạn có thể ghi đè lên các phương pháp getView của 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; 
    } 
}; 

Nếu bạn không để ý: các trick là để cung cấp android.R.id.text1 như tham số (chủ yếu là không cần thiết), nếu không cuộc gọi đến super sẽ gây ra một ngoại lệ .

Ngoài ra, giải pháp này không tận dụng TwoLineListItem, được tán thành trong API 17.

+0

Cảm ơn bạn đã làm việc này! Biến 'list' được truyền cho' ArrayAdapter' không bao giờ thực sự được sử dụng. – Fred

+0

Có, TwoLineListItem đã không được chấp nhận nhưng không nghĩ rằng nó là bằng cách nào đó liên quan đến SimpleCursorAdapter chỉ vì chúng đã được sử dụng cùng nhau trong ví dụ của Vipul. SimpleCursorAdapter là một thực thi ListAdapter rất hữu ích, tổng quát lặp lại thông qua các hàng con trỏ, ánh xạ các cột đã cho đến các khung nhìn bố trí đã cho. Nó thường được ưa thích hơn bằng cách viết ListAdapter của riêng bạn khi populating một ListView từ một con trỏ. Mặc dù, ngay cả khi bạn không sử dụng một con trỏ, nó có thể không được ra khỏi câu hỏi để sử dụng một SimpleCursorAdapter và bọc dữ liệu của bạn trong một MatrixCursor. – spaaarky21

+0

Bạn nói đúng, TwoLineListItem không liên quan đến SimpleCursorAdapter. Tôi đưa vào nhận xét đơn giản chỉ vì TwoLineListItem được sử dụng trong hai câu trả lời khác. Giải pháp của tôi chỉ dành cho danh sách đơn giản, ngắn gọn. Các giải pháp nâng cao hơn sẽ có nghĩa là cũng sử dụng mẫu ViewHolder. – winne2

4

hy vọng điều này giúp bạn

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

          }; 
Các vấn đề liên quan