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