Android ListView fixe la hauteur de l'élément de
Eu un petit problème. J'aimerais créer un android affichage de la liste de l'activité avec tous les éléments de la liste ayant une hauteur fixe.
Donc, de mon point de mise en page (thread_item.xml ressemble à ceci:
<?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="300dip"
>
<TextView android:id="@+id/thread_item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="[dummy]"
android:textSize="20dip"
android:textStyle="bold"
/>
<ImageView android:id="@+id/thread_first_image"
android:layout_below="@id/thread_item_title"
android:scaleType="centerInside"
android:maxWidth="100dip"
android:maxHeight="100dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true" />
<TextView
android:id="@+id/thread_item_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/thread_first_image"
android:text="[dummy]"
android:textSize="15dip">
</TextView>
</RelativeLayout>
J'ai mis layout_height de l'élément racine 300dip et attendons de tous les éléments ont la même hauteur, mais ils ne le font pas. Quand je lance l'application, il ressemble à la hauteur d'avoir un wrap_content valeur.
En outre, l'activité en elle-même ressemble à ceci:
public class ThreadListActivity extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
Code to get items from the storage.
*/
setListAdapter(new ThreadItemAdapter(this, R.layout.thread_item, itemsArray)));
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
/*Start new Activity. Unrelated stuff.*/
}
});
}
}
Et adaptable, je suis en utilisant ressemble à ceci:
public class ThreadItemAdapter extends ArrayAdapter<ThreadItem> {
Activity context;
List<ThreadItem> items;
public ThreadItemAdapter(Activity context, int textViewResourceId, List<ThreadItem> items) {
super(context, textViewResourceId, items);
this.context = context;
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inf = this.context.getLayoutInflater();
View result;
if (convertView == null) {
result = inf.inflate(R.layout.thread_item, null);
} else {
result = convertView;
}
TextView tbTitle = (TextView) result.findViewById(R.id.thread_item_title);
TextView tbPreview = (TextView) result.findViewById(R.id.thread_item_preview);
ImageView ivFirstImage = (ImageView) result.findViewById(R.id.thread_first_image);
ThreadItem item = items.get(position);
tbTitle.setText(item.getThreadTitle());
ivFirstImage.setImageBitmap(item.getFirstImage());
SimpleLeadingMarginSpan span = new SimpleLeadingMarginSpan(item.getFirstImage() != null ? 5 : 0, 115); //TODO: const
SpannableString previewText = new SpannableString(item.getThreadPreview());
previewText.setSpan(span, 0, previewText.length(), 0);
tbPreview.setText(previewText);
return result;
}
}
Je ne vois pas pourquoi tous les éléments de la liste toujours envelopper leur contenu et ne pas rester 300dip en hauteur. Ils peuvent être à la fois plus petits ou plus grands, alors 300dip.
Je suis sous android 2.3.3, les essais sur le HTC Evo 3D de l'appareil et un émulateur (montrent le même résultat).
Merci beaucoup à l'avance.
UPD:
Merci à Miguel et Sam. La solution est de mettre maxHeight pour le textView, ce qui rend mon élément de la liste de croître (qui serait +id/thread_item_preview
) et le réglage de la RelativeLayout de minHeight à 300dip ainsi, pour l'empêcher de se réduire.
OriginalL'auteur Dmitriy | 2012-04-30
Vous devez vous connecter pour publier un commentaire.
Que faire si vous changez tous les enfants de vue des hauteurs dans la ligne de
wrap_content
àmatch_parent
?De commentaires
Avez-vous essayé le
minHeight
etmaxHeight
attributs? Par exemple:Vous devriez aussi regarder Android Romain Guy discuter de l'efficacité dans les adaptateurs et
getView()
.id/thread_item_preview
encore un peu d'étirements RelativeLayout d'être plus grand et le réseau lui-même, encore réduit si le contenu a besoin de moins de 300dips hauteur. En tout cas, merci pour la suggestion.Hmph, avez-vous essayé le
minHeight
etmaxHeight
attributs?Doit y ai pensé, merci! Poste la solution dans un instant.
Si nous avons défini la hauteur min et max de la hauteur pour être le même qu'y aurait-il lorsque la taille du texte dans la liste d'affichage est supérieure à la hauteur?
C'est une mauvaise réponse. la bonne solution est de passer de la mère à gonfler
OriginalL'auteur Sam
lors du gonflage pour convertView, au lieu de simplement
ne
La méthode en question est
inflater.inflate(int viewId, ViewGroup parent, boolean attachToRoot)
-- parce que vous êtes de ne pas honorer le fourniparent
(qui dans ce cas est la Liste), quelle que soit la dimension que vous fournissez à l'élément de liste, par défaut, être mis à layout_width=fill_parent, layout_height=wrap_content, en ignorant le 300dip hauteur que vous avez spécifié dans le format xml. Par la fourniture de la vue parent et en passantfalse
, le inflater mettra à l'honneur la 300dip de la hauteur, tout n'est pas de l'attacher à la racine (le parent).getView
méthodeparent
est nulle pour une raison quelconque.avez-vous essayé? est-il de la plante lorsque vous utilisez la surcharge gonfler?
Mon mauvais, le parent n'a pas la valeur null, désolé pour ça. Et ressemble à une version surchargée fonctionne également. Je vous remercie.
Excellente Solution...a fonctionné pour moi..!!
Oui c'est la solution..
OriginalL'auteur josephus
Essayez de changer ce
à
Cela a fonctionné pour moi à l'aide d'un ExpandableListView, donc je suppose qu'il va travailler pour ce cas.
Beaucoup 🙂 En passant, je pense que j'ai fait une faute de frappe. Il est "android:minHeight", pas "android:layout_minHeight".
Travaillé pour mon problème de trop. Merci!
Travaillé pour moi, mais je me dois de mentionner que cette réponse doit être utilisé avec @josèphe réponse c'est à dire à l'aide de
inflate(R.layout.thread_item, parent, false);
Mais ces états sont égaux
OriginalL'auteur Miguel Botón
Vous pouvez atteindre cet objectif en spécifiant la même dimension pour Min et Max. Cela a réglé mon problème.
OriginalL'auteur Vinit Shandilya
Essayez de définir le contenu TextView hauteur pour le
0dp
, puis en définissant salayout_alignParentBottom
àtrue
.OriginalL'auteur kabuko
OriginalL'auteur vrbsm
Si je ne me trompe pas, la liste modifie automatiquement le LayoutParams d'une vue personnalisée pour wrap_content, wrap_content. Toutefois, les réponses ci-dessus sont correctes, si vous définissez un minHeight ou minWidth il travaillera avec brio.
OriginalL'auteur DoruChidean