Me gustaría crear un Activity que contiene una lista en la que las filas tienen un diseño personalizado.
Así que he creado el list_entry_layout.xml archivo que define el diseño que cada fila de mi lista debe tener (en mi ejemplo, cada fila debe tener un título y un resumen):

<?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>

Mi problema es que no sé cómo agregar los datos para cada fila en la ListActivity clase.
Con el siguiente fragmento de código que yo soy capaz de agregar los títulos de cada fila:

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

    }
}

Para añadir también el resumen de cómo debo hacer?

Si puedo añadir este código que voy a tener los resúmenes visualizado, y no los títulos:

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

El resultado es el siguiente, me gustaría obtener:

ListView personalizado con el de la Fila de Diseño de Android

InformationsquelleAutor Matteo | 2012-07-01

3 Comentarios

  1. 32

    Usted necesita para crear su propio ArrayAdapter:

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

    Entonces usted debe especificar cómo será el aspecto de su fila con XML, exactamente para tu objetivo, te recomiendo usar RelativeLayout y puede se parece a esto:

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

    Así, en YourAdapter tiene que establecer super constuctor:

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

    A continuación, para personalizar sus datos en ListView + más eficaz aplicación que te recomiendo reemplazar getView() método y también el uso de 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;  
    }

    Finalmente, sólo inicializar ListView y establecer Adapter:

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

    Nota: Design pattern Holder representa arbitraria objeto que contiene los widgets hijos de cada fila, por lo que necesita para encontrar sólo una vez y, a continuación, con Holder objeto de que usted siempre tendrá acceso a ellos.

    Implementación de Holder puede parece a esto:

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

    Espero que ayude.

  2. 13

    Puede lograr este diseño utilizando android.R.layout.simple_list_item_2 en lugar de la creación Personalizada de la fila de diseño.

    De todos modos si quieres ir con la costumbre de la fila de diseño de enfoque, a continuación, he fragmento listo para usted.

    Aquí tienes.

    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;
        }
    }
    • es necesario crear adaptador personalizado para el diseño personalizado
  3. 4

    Construir su propio ArrayAdapter.

    Véase, por ejemplo,http://www.ezzylearning.com/tutorial.aspx?tid=1763429.

    • Es la única solución posible?
    • Usted necesita reemplazar el getView() método de la ArrayAdapter para llenar su listrow.
    • Ok, así que tengo 2 posibilidades?cual es mejor en su opinión, sustituir un método, o escribir mi propio arrayadapter?
    • No, me refería a que necesita el ArrayAdapter para anular la getView() método de la ArrayAdapter.
    • Este tutorial es muy útil para mí. La única cosa que yo recomiendo hacer diferente es que en lugar de un array (Tiempo []), me di cuenta (gracias a stackoverflow.com/a/20479071/2162226 ) que debo utilizar la Lista de<Tiempo> .. de esta manera cuando se actualiza la lista, puede llamar al método notify después de la actualización para actualizar el listView elemento de interfaz de usuario.

Dejar respuesta

Please enter your comment!
Please enter your name here