2012-07-01 4 views
19

Я хотел бы создать Activity, содержащий список, в котором строки имеют собственный макет. Таким образом, я создал list_entry_layout.xml файл, определяющий раскладку, что каждая строка моего списка должны иметь (в моем примере каждая строка должна иметь название и краткое описание):ListView с настраиваемой строкой Row - 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> 

Моя проблема заключается в том, что я не знаю как добавить данные в каждую строку класса ListActivity. С следующий фрагмент кода я могу добавить названия каждой строки:

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

    } 
} 

Для добавления также резюме, как я должен делать?

Если добавить этот код у меня будет резюме визуализируются, а не титулы:

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

Ниже результат я хотел бы получить:

enter image description here

ответ

31

Вам нужно создать свой собственный ArrayAdapter:

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

Затем вы должны определить, как будет выглядеть ваш строку с XML, именно для вашей цели, я рекомендую вам использовать RelativeLayout и это может выглядеть следующим образом:

ряд ,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> 

Итак, в YourAdapter вы должны установить супер constuctor:

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

Тогда для настройки данных в ListView + более эффективной реализации я рекомендую вам переопределить getView() метод, а также использовать 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; 
} 

Наконец просто инициализировать ListView и установить Adapter:

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


Примечание:Design pattern Holder представляет собой произвольный объект, который содержит дочерние виджеты каждой строки, так что вы должны найти их только один раз, а затем Holder вы всегда будете иметь к ним доступ.

Реализация Holder банки выглядит следующим образом:

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


Надеется, что это помогает.

4

Создайте свой собственный ArrayAdapter.
См., Например, http://www.ezzylearning.com/tutorial.aspx?tid=1763429.

+0

Это единственное возможное решение? – Matteo

+0

Вам нужно переопределить метод 'getView()' 'ArrayAdapter', чтобы заполнить ваш список. – nhaarman

+0

Итак, у меня есть 2 возможности? Какой из них лучше, по вашему мнению, переопределить метод или написать собственный массив? – Matteo

12

Вы можете достичь этого макета, используя android.R.layout.simple_list_item_2, а не создавать пользовательскую раскладку строк.

В любом случае, если вы хотите использовать индивидуальный подход к построению строк, у меня есть готовый к использованию фрагмент.

Здесь вы идете.

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; 
    } 
} 
Смежные вопросы