2013-06-14 12 views
5

Stavo creando un'applicazione Android in cui utilizzo un controllo ListView. ListView è costituito da elementi di elenco CheckedTextView. La mia attività contiene un EditText in alto, una TextView sotto e un Button in basso. Lo spazio tra TextView e il pulsante è l'area occupata da ListView. Ora, dato che il mio ListView contiene pochi elementi, l'intero spazio di ListView non è occupato da essi. Anche lo spazio rimasto ovviamente varia da un dispositivo all'altro. Quello che voglio sapere è se c'è un modo per modificare l'altezza della riga di ListView in modo che l'intero spazio assegnato a ListView sia coperto. Inoltre, se si verifica la necessità di aggiungere alcuni elementi, l'altezza della riga può essere modificata di conseguenza. Di seguito ho fornito alcuni frammenti di codice in modo che sia facile capire come è il mio layout.Modifica dinamica dell'altezza della riga in un listview basato sul numero di voci di elenco

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="#D0D0D0" 
tools:context=".MainActivity" > 

<Button 
    android:id="@+id/addcourse" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:text="Add Course" /> 

<EditText 
    android:id="@+id/coursenameet" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:ems="10" 
    android:layout_marginBottom="2dp" 
    android:layout_marginTop="2dp" 
    android:hint="Course Name" 
    android:inputType="textCapWords" > 

    <requestFocus /> 
</EditText> 

<View 
    android:id="@+id/divider" 
    android:layout_width="match_parent" 
    android:layout_height="3dp" 
    android:layout_below="@+id/coursenameet" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:background="@android:color/darker_gray" > 
</View> 

<TextView 
    android:id="@+id/weekdaytv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/divider" 
    android:layout_marginBottom="3dp" 
    android:layout_marginTop="3dp" 
    android:layout_centerHorizontal="true" 
    android:text="Select weekdays for this Course" > 
</TextView> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/addcourse" 
    android:layout_below="@+id/weekdaytv" 
    android:divider="#FFFFFF" 
    android:dividerHeight="2px"> 

</ListView> 

</RelativeLayout> 

Gli articoli sono CheckedTextViews che vengono implementati utilizzando BaseAdapter. Il metodo Veduta di classe BaseAdapter è

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    int colorpos = position % colors.length; 
    if(v == null){ 
     LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listviewitem, null); 
    } 
    CheckedTextView newrow = (CheckedTextView) v.findViewById(R.id.checkedtextview); 
    v.setBackgroundColor(colors[colorpos]); 
    newrow.setTextColor(Color.BLACK); 
    newrow.setText(items[position]); 
    return v; 
} 

EDIT: Snippet dal Main Activity

lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    adapter = new ItemsAdapter(MainActivity.this, weekdays, 6, lv.getBottom() - lv.getTop()); 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      CheckedTextView ctv = (CheckedTextView) arg1; 
      adapter.toggle(ctv); 
     } 
    }); 
+0

Got qualsiasi soluzione giusta? –

risposta

0

Per impostare il ListView per riempire l'intero spazio assegnato, è possibile impostare l'attributo listView in XML:

android:fillViewport=”true” 

O nel codice:

myListView.setFillViewport(true); 

Se si desidera modificare la dimensione di una cella, è possibile calcolare ViewParams da impostare. Ad esempio, per una singola cella, è possibile utilizzare:

AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT); 
v.setLayoutParams(params); 

Per n celle, è possibile calcolare la dimensione verticale in base alle dimensioni del vostro ListView:

int n = /* number of cells */ 3; 
int height = (myListView.getBottom() - myListView.getTop()); 
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, height/n); 
v.setLayoutParams(params); 
+0

Viene visualizzato un errore: - È prevista una quotazione aperta per l'attributo "android: fillViewport" associato a un tipo di elemento "ListView". Per favore aiuto. – tintin

+0

Per favore dimmi cosa è myCell nell'ultima riga della risposta. Non ho un valore corrispondente nel mio codice. Dimmi anche se questo deve essere fatto nell'attività principale o nella classe BaseAdapter che ho. – tintin

+0

@tintin, aggiorno il codice per utilizzare la variabile v. – Phil

11

Hi Creare una classe ti piace questa

public class Utility { 

    public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 


} 

chiamare questo metodo dove vuoi in modo dinamico di modificare l'altezza delle righe in una lista.

Utility.setListViewHeightBasedOnChildren(YourListView); 

Per ulteriori Reference .. Spero che questo vi aiuterà.

+0

Ho dichiarato l'aspetto delle mie righe nella classe BaseAdapter. Per favore dimmi cosa farà esattamente ?? Inoltre sto impostando il mio adattatore usando: - lv.setAdapter (adattatore); Dovrei chiamare questo metodo subito dopo? Supponiamo che io abbia corretto il numero di righe in questo momento e non sto aggiungendo nessuna riga al momento. – tintin

+1

dichiara semplicemente la tua listview in quel metodo. ti darà esattamente quello che vuoi. – Nirmal

+0

Mi dispiace davvero ma non riesco a capirti. Ho modificato la mia domanda e ho inserito uno snippet del codice di attività principale per farti vedere esattamente cosa sto facendo. Suggerisci dove dovrei chiamare il metodo. – tintin

0

Per chi ancora ha ricevuto l'errore in

listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

scrivere queste righe di codice, come questo.

se (listItem instanceof ViewGroup)

listItem.setLayoutParams (nuove LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

 listItem.measure(0, 0);