2012-07-01 18 views
19

Mi piacerebbe creare uno Activity contenente un elenco in cui le righe hanno un layout personalizzato. Così ho creato il file list_entry_layout.xml definizione del layout che ogni riga della mia lista dovrebbe avere (nel mio esempio ogni riga deve avere un titolo e una sintesi):ListView con layout riga personalizzato - 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> 

mio problema è che non so come aggiungere i dati a ciascuna riga nella classe ListActivity. Con il seguente frammento di codice che sono in grado di aggiungere i titoli di ogni riga:

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

    } 
} 

Per aggiungere anche il sommario come devo fare?

Se posso aggiungere questo codice avrò la sintesi visualizzate, e non i titoli:

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

Quello che segue è il risultato mi piacerebbe ottenere:

enter image description here

risposta

31

È necessario creare il proprio ArrayAdapter:

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

allora si dovrebbe specificare come apparirà la riga con XML, esattamente per il tuo obiettivo, vi consiglio di utilizzare RelativeLayout e può assomiglia a questo:

fila .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> 

Allora in YourAdapter è necessario impostare eccellente constuctor:

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

Poi per personalizzare i dati in ListView + più efficace attuazione ti raccomando ignorare getView() metodo e anche di utilizzare 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; 
} 

Infine basta inizializzare ListView e impostare Adapter:

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


Nota:Design pattern Holder rappresenta oggetto arbitrario che contiene widget figli di ogni riga, quindi è necessario trovare loro una sola volta e poi con Holder oggetto avrete sempre accesso a loro.

Attuazione Holder lattina si presenta così:

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


Speranza che aiuta.

12

È possibile ottenere questo layout utilizzando android.R.layout.simple_list_item_2 anziché creare il layout di riga personalizzato.

In ogni caso, se si vuole andare con l'approccio del layout di riga personalizzato, ho lo snippet pronto per voi.

Ecco qui.

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