2012-02-08 6 views
4

Je suis complètement nouveau à Java/Android et suis coincé avec des listes.Android ListView et ArrayAdapter/Arraylist

Ce que je veux est d'avoir 4 lignes dans une ligne listview avec différents styles de police

rowlayout.xml 

<TextView 
    android:id="@+id/1" 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/2" 
    android:textSize="30sp" 
    android:textStyle="bold" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

<TextView 
    android:id="@+id/3" 
    android:typeface="sans" 
    android:textSize="20sp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

    <TextView 
    android:id="@+id/4" 
    android:typeface="sans" 
    android:textSize="15sp" 
    android:textStyle="italic" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

J'ai ceci dans un fichier xml séparé

results.xml 

<ListView 
android:id="@android:id/list" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_below="@id/TitleLbl" > 
</Listview> 

et mon adaptateur de tableau se présente comme suit

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowlayout, R.id.2, Array); 
setListAdapter(adapter); 

Ce que je suis en train de faire est d'obtenir un arraylist (contenant ID, nom, prénom et numéro) à p opulate the listview de sorte que chaque information est sur sa propre ligne dans la ligne.

l'adaptateur de tableau ci-dessus fonctionne, mais chacune des quatre informations est dans leur propre ligne.

Quelqu'un peut-il aider?

(aussi, je l'ai surfé sur Internet pour essayer de régler ce problème, mais ne peut pas sembler trouver quelque chose qui me aide)

Répondre

7

Vous devrez peut-être utiliser l'affichage liste personnalisée avec adaptateur tableau personnalisé. Référez-vous par exemple à link.

Contenu:

Le tutoriel HelloListView (http://developer.android.com/resources/tutorials/views/hello-listview.html) Android montre comment lier un ListView à un tableau d'objets de chaîne, mais vous aurez probablement deviennent trop grand que assez rapidement. Ce post vous montrera comment lier le ListView à un ArrayList d'objets personnalisés, ainsi que de créer un ListView multi-ligne. Imaginons que vous ayez une sorte de fonctionnalité de recherche qui renvoie une liste de personnes, avec des adresses et des numéros de téléphone. Nous allons afficher ces données dans trois lignes formatées pour chaque résultat, et le rendre cliquable. Commencez par créer votre nouveau projet Android et créez deux fichiers de mise en page. Main.xml sera créé probablement déjà par défaut, coller si ceci dans:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
<TextView 
    android:layout_height="wrap_content" 
    android:text="Custom ListView Contents" 
    android:gravity="center_vertical|center_horizontal" 
    android:layout_width="fill_parent" /> 
    <ListView 
    android:id="@+id/ListView01" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"/> 
</LinearLayout> 

Ensuite, créez un fichier de mise en page appelé custom_row_view.xml. Cette disposition sera le modèle pour chaque ligne individuelle dans ListView. Vous pouvez utiliser à peu près tout type de mise en page - relative, table, etc., mais pour cela, nous allons simplement utiliser Linear:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:id="@+id/name" 
    android:textSize="14sp" 
    android:textStyle="bold" 
    android:textColor="#FFFF00" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
<TextView android:id="@+id/cityState" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
<TextView android:id="@+id/phone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 

Maintenant, ajoutez un objet appelé SearchResults. Collez ce code dans:

public class SearchResults { 
private String name = ""; 
private String cityState = ""; 
private String phone = ""; 

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

public String getName() { 
    return name; 
} 

public void setCityState(String cityState) { 
    this.cityState = cityState; 
} 

public String getCityState() { 
    return cityState; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public String getPhone() { 
    return phone; 
} 
} 

C'est la classe que nous allons combler les postes avec nos données et le chargement dans un ArrayList.

Ensuite, vous aurez besoin d'un adaptateur personnalisé. Celui-ci étend juste le BaseAdapter, mais vous pouvez étendre le ArrayAdapter si vous préférez.

public class MyCustomBaseAdapter extends BaseAdapter { 
private static ArrayList<SearchResults> searchArrayList; 

private LayoutInflater mInflater; 

public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) { 
    searchArrayList = results; 
    mInflater = LayoutInflater.from(context); 
} 

public int getCount() { 
    return searchArrayList.size(); 
} 

public Object getItem(int position) { 
    return searchArrayList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.custom_row_view, null); 
    holder = new ViewHolder(); 
    holder.txtName = (TextView) convertView.findViewById(R.id.name); 
    holder.txtCityState = (TextView) convertView.findViewById(R.id.cityState); 
    holder.txtPhone = (TextView) convertView.findViewById(R.id.phone); 

    convertView.setTag(holder); 
    } else { 
    holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.txtName.setText(searchArrayList.get(position).getName()); 
    holder.txtCityState.setText(searchArrayList.get(position).getCityState()); 
    holder.txtPhone.setText(searchArrayList.get(position).getPhone()); 

    return convertView; 
} 

static class ViewHolder { 
    TextView txtName; 
    TextView txtCityState; 
    TextView txtPhone; 
} 
} 

(Ceci est fondamentalement le même que le List14.java API demo)

Enfin, nous allons câbler tous dans le fichier principal de classe:

public class CustomListView extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ArrayList<SearchResults> searchResults = GetSearchResults(); 

     final ListView lv1 = (ListView) findViewById(R.id.ListView01); 
     lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults)); 

     lv1.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
      Object o = lv1.getItemAtPosition(position); 
      SearchResults fullObject = (SearchResults)o; 
      Toast.makeText(ListViewBlogPost.this, "You have chosen: " + " " + fullObject.getName(), Toast.LENGTH_LONG).show(); 
     } 
     }); 
    } 

    private ArrayList<SearchResults> GetSearchResults(){ 
    ArrayList<SearchResults> results = new ArrayList<SearchResults>(); 

    SearchResults sr1 = new SearchResults(); 
    sr1.setName("John Smith"); 
    sr1.setCityState("Dallas, TX"); 
    sr1.setPhone("214-555-1234"); 
    results.add(sr1); 

    sr1 = new SearchResults(); 
    sr1.setName("Jane Doe"); 
    sr1.setCityState("Atlanta, GA"); 
    sr1.setPhone("469-555-2587"); 
    results.add(sr1); 

    sr1 = new SearchResults(); 
    sr1.setName("Steve Young"); 
    sr1.setCityState("Miami, FL"); 
    sr1.setPhone("305-555-7895"); 
    results.add(sr1); 

    sr1 = new SearchResults(); 
    sr1.setName("Fred Jones"); 
    sr1.setCityState("Las Vegas, NV"); 
    sr1.setPhone("612-555-8214"); 
    results.add(sr1); 

    return results; 
    } 
} 

Notez que nous obtenons d'abord un ArrayList d'objets searchresults (normalement ce serait d'une source de données externe ...), passez-le à l'adaptateur personnalisé, puis configurez un écouteur de clic. L'écouteur obtient l'élément qui a été cliqué, le convertit en un objet SearchResults et fait tout ce qu'il doit faire.

+0

grâce @thinksteep, j'ai eu un coup d'œil à travers elle et adapté à mon code, mais je suis toujours à obtenir des erreurs - 'finale ListView LV1 = (ListView) findViewById (R.id.list);' cela est défini sur null et lance une exception NullPointerException – Krath

+0

Avez-vous étendu listview? Si c'est le cas, getlistview devrait suffire. Mettez à jour la question avec le dernier code. – kosa

+0

Je pense que j'ai - J'ai suivi l'exemple mot à mot, mais remplacé le bit où vous remplissez la liste - quel code dois-je ajouter à l'édition? – Krath