web-dev-qa-db-fra.com

Android Listview afficher un seul élément

J'ai un ListView, où j'ai changé l'apparence de la ligne, mais listview ont la taille d'une ligne, au lieu de plein écran.

list_item.xml:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >

<TextView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>

<LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" >

    <TextView
        Android:id="@+id/textView_news_time"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:textColor="#0082A8" />

    <TextView
        Android:id="@+id/textView_news_header"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
</LinearLayout>

<TextView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" />

</LinearLayout>

tab_news.xml:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:orientation="vertical" >

<ListView
    Android:id="@+id/list_news"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >

 </ListView>

  </LinearLayout>

Faire l'adaptateur:

public class RSSAdapter extends ArrayAdapter<RSSitem> {
Context context; 
int layoutResourceId;    
ArrayList<RSSitem> data = null;
SimpleDateFormat sdf = new SimpleDateFormat("kk:mm ");
public RSSAdapter(Context context, int layoutResourceId, ArrayList<RSSitem> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    NewsHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new NewsHolder();
        holder.txtTime = (TextView)row.findViewById(R.id.textView_news_time);
        holder.txtNews = (TextView)row.findViewById(R.id.textView_news_header);

        row.setTag(holder);
    }
    else
    {
        holder = (NewsHolder)row.getTag();
    }

    RSSitem item = data.get(position);
    holder.txtTime.setText(sdf.format(item.getPubDate()));
    holder.txtNews.setText(item.getTitle());

    return row;
}

static class NewsHolder
{
    TextView txtTime;
    TextView txtNews;
}

Les articles défilent.

Désolé pour mon mauvais anglais. Merci pour l'aide

Les conseils de @Varun n'ont pas aidé

J'ai trouvé une erreur. Merci. Répondre en "réponses")

29
Artem

J'ai trouvé une erreur. tab_news était dans ScrollView of TabHost . Erreur si stupide ( Merci pour l'aide.

Mise à jour:ListView ne doit pas être underScrollView in xml . Si c'est le cas, le même problème se produit.

Mise à jour 2: Vous pouvez utiliser NestedScrollView

90
Artem

Si vous utilisez ListView dans ScrollView, vous avez ce problème. Et ma solution est la suivante: 

1. Créer une liste personnalisée qui ne peut pas défiler  

public class NonScrollListView extends ListView {

public NonScrollListView(Context context) {
    super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();    
}

}

2. Utiliser la classe personnalisée ci-dessus pour un fichier xml

  <xx.xx.NonScrollListView
        Android:id="@+id/lv_nonscroll_list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" >
    </xx.xx.NonScrollListView>

Cela a bien fonctionné sur toutes les versions d'OS pour moi… __. J'espère le meilleur pour vous.

10
Hai Rom

Dans le parent de list_item.xml, LinearLayout, vous utilisez Android:layout_height="fill_parent" Évidemment, cela va se développer verticalement.

OU:

utilisez l'outil monitor, allez à hierarchy viewer, examinez le modèle en cours d'exécution en détail. Recherchez la vue présentant le problème, vérifiez que ses attributs/propriétés sont corrects, passez à la vue parent et vérifiez-la jusqu'à trouver le problème.

4
S.D.

Je pense que Listview ne prend qu'un seul enregistrement de vos données. Il suffit de vérifier que vous avez toutes les données que vous souhaitez afficher dans Listview.

OR

Veuillez vérifier votre list_item.xml, Remplacer

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="**wrap_content**"
Android:orientation="vertical" >

au lieu de,

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="**fill_parent**"
Android:orientation="vertical" >
0
Pratik Dasa

La modification dynamique de la hauteur donne la plupart du temps à NPE ... la meilleure solution consiste à créer une vue de liste personnalisée non défilable. Vous trouverez beaucoup de codes pour cela.

0
Ashish Kumar