2012-07-01 37 views
19

Tôi muốn tạo một Activity chứa danh sách trong đó các hàng có bố cục tùy chỉnh. Vì vậy, tôi đã tạo list_entry_layout.xml tập tin định bố trí cho mỗi hàng trong danh sách của tôi nên có (trong ví dụ của tôi mỗi hàng phải có một tiêu đề và tóm tắt):ListView với Bố cục hàng tùy chỉnh - Android

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/list_entry_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20dp" > 
    </TextView> 

    <TextView 
     android:id="@+id/list_entry_summary" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="10dp" > 
    </TextView> 

</LinearLayout> 

Vấn đề của tôi là tôi không biết cách thêm dữ liệu vào mỗi hàng trong lớp ListActivity. Với đoạn mã sau đoạn mã tôi có thể thêm các tiêu đề của mỗi hàng:

public class MyActivity extends ListActivity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_activity); 

     ListView listView = (ListView) findViewById(android.R.id.list); 
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
      "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
      "Linux", "OS/2" }; 

     ArrayAdapter<String> titleAdapter = new ArrayAdapter<String>(this, R.layout.list_entry_layout, R.id.list_entry_title, values); 
     // Assign adapter to ListView 
     listView.setAdapter(titleAdapter); 

    } 
} 

Để thêm cũng tóm tắt làm thế nào tôi nên làm gì?

Nếu tôi thêm mã này, tôi sẽ có các bản tóm tắt hình dung, và không phải là danh hiệu:

String[] values = new String[] { "Android_summary", "iPhone_summary", "WindowsMobile_summary", "Blackberry_summary", "WebOS_summary", "Ubuntu_summary", "Windows7_summary", "Max OS X_summary", "Linux_summary", "OS/2_summary" }; 
ArrayAdapter<String> summaryAdapter = new ArrayAdapter<String>(this, R.layout.list_entry_layout, R.id.list_entry_summary, values); 
// Assign adapter to ListView 
listView.setAdapter(summaryAdapter); 

Sau đây là kết quả tôi muốn để có được:

enter image description here

Trả lời

31

Bạn cần phải tạo riêng ArrayAdapter bạn:

private class YourAdapter extends ArrayAdapter<String> { 
    // do some work 
} 

Sau đó, bạn nên xác định như thế nào sẽ xem xét hàng của bạn với XML, chính xác cho mục tiêu của bạn, tôi khuyên bạn nên bạn sử dụng RelativeLayout và nó có thể trông như thế này:

hàng .xml

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

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     /> 

    <TextView 
     android:id="@+id/email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@id/name" 
     /> 

</RelativeLayout> 

Vì vậy, sau đó trong YourAdapter bạn phải thiết lập siêu constuctor:

public YourAdapter() { 
    super(YourActivity.this, R.layout.row, data); 
} 

Sau đó cho tùy chỉnh dữ liệu của bạn trong ListView thực hiện hiệu quả hơn + i khuyên để bạn ghi đè getView() phương pháp và cũng có thể sử dụng Holder design pattern.

@Override 
public View getView(int position, View convertView, ViewGroup parent) {   
    ViewHolder holder = null; 
    LayoutInflater inflater = getLayoutInflater(); 
     if (convertView == null) { 
     convertView = inflater.inflate(R.layout.row, null, false); 
     holder = new ViewHolder(convertView); 
     convertView.setTag(holder); 
     } 
     else { 
     holder = (ViewHolder) convertView.getTag(); 
     }  
     holder.getUpperText().setText(dataSource[position]); 
     holder.getLowerText().setText(dataSource[position]); 

    return convertView; 
} 

Cuối cùng chỉ khởi ListView và thiết lập Adapter:

ListView list = (ListView) findViewById(R.id.list); 
list.setAdapter(new YourAdapter()); 


Lưu ý:Design pattern Holder đại diện cho đối tượng tùy ý chứa các widget con của mỗi hàng, vì vậy bạn cần phải tìm thấy chúng chỉ một lần và sau đó với Holder đối tượng bạn sẽ luôn có quyền truy cập vào chúng.

Thực hiện Holder lon trông như thế này:

public class ViewHolder { 
    private View row; 
    private TextView upperText = null, lowerText = null; 

    public ViewHolder(View row) { 
     this.row = row; 
    } 

    public TextView getUpperText() { 
     if (this.upperText == null) { 
     this.upperText = (TextView) inView.findViewById(R.id.someId); 
     } 
     return this.upperText; 
    } 

    public TextView getLowerText() { 
     if (this.lowerText == null) { 
     this.lowerText = (TextView) inView.findViewById(R.id.someId); 
     } 
     return this.lowerText; 
    } 
} 


Hy vọng nó giúp.

4

Xây dựng ArrayAdapter của riêng bạn.
Xem ví dụ http://www.ezzylearning.com/tutorial.aspx?tid=1763429.

+0

Đó là giải pháp duy nhất có thể? – Matteo

+0

Bạn cần ghi đè phương thức 'getView()' của 'ArrayAdapter' để điền vào listrow của bạn. – nhaarman

+0

Ok vì vậy tôi có 2 khả năng? Cái nào tốt hơn trong ý kiến ​​của bạn, ghi đè lên một phương thức, hoặc viết arrayadapter của riêng tôi? – Matteo

12

Bạn có thể đạt được bố cục này bằng cách sử dụng android.R.layout.simple_list_item_2 thay vì tạo bố cục hàng tùy chỉnh.

Dù sao nếu bạn muốn đi với cách tiếp cận bố cục hàng tùy chỉnh thì tôi có đoạn mã sẵn sàng cho bạn.

Thông tin cho bạn đây.

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

     Mobile mobile; 

     ArrayList<Mobile> mobiles new ArrayList<Mobile>(); 

     mobile = new Mobile(); 
     mobile.setName("Android"); 
     mobile.setSummary("summary goes here"); 
     mobiles.add(mobile); 

     mobile = new Mobile(); 
     mobile.setName("Blackberry"); 
     mobile.setSummary("summary goes here"); 
     mobiles.add(mobile); 

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

} 

Mobile.java

class Mobile { 
    String name; 
    String summary; 

    public String getName() { 
     return name; 
    } 

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

    public String getSummary() { 
     return summary; 
    } 

    public void setSummary(String summary) { 
     this.summary = summary; 
    } 

} 

MyAdapter.java

class MyAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Mobile> mobiles; 

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

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

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

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

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


     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = (View) inflater.inflate(
        R.layout.list_entry_layout, null); 
     } 

     TextView name = (TextView)convertView.findViewById(R.id.list_entry_title); 
     TextView summary=(TextView)convertView.findViewById(R.id.list_entry_summary); 

     name.setText(mobiles.get(position).getName()); 
     summary.setText(mobiles.get(position).getSummary()); 

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