Pytanie Jak używać addHeaderView, aby dodać prosty ImageView do ListView


Mój cel jest prosty. Chcę dodać "Czerwony prostokąt" jako widok nagłówka do a ListView. więc tworzę prostą czynność

public class MainActivity extends Activity {
    private String[] adapterData = new String[] { "Afghanistan", "Albania", "Algeria", 
            "American Samoa", "Andorra", "Angola"}; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv;
        lv = (ListView)findViewById(R.id.list);

        LayoutInflater lf;
        View headerView;
        lf = this.getLayoutInflater();
        headerView = (View)lf.inflate(R.layout.header, null, false);

        lv.addHeaderView(headerView, null, false);

        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, adapterData)); 
    }
}

activity_main.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FF0" 
        android:cacheColorHint="#0000"
        android:paddingLeft="20dip"
        android:paddingRight="20dip"
        android:divider="#0000"
        android:scrollbarStyle="outsideOverlay" />

list_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:minHeight="40dip"
    android:singleLine="true"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
/>

najważniejsze, header.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dip"
    android:background="#F00"/>

Ale to nie działa. Nic nie jest wyświetlane.

Czy można podać jakieś sugestie na ten temat? Twoja pomoc jest bardzo cenna.


14
2017-10-22 05:42


pochodzenie


Oto rozwiązanie -> stackoverflow.com/a/34557372/542532 - Sadegh


Odpowiedzi:


Stare pytanie, ale właśnie je skopiowałem i uruchomiłem, a czerwony nie pojawia się.

Tęskniłeś za jedną prostą rzeczą: Niezależnie od tego, jak dzwonisz inflate ty zawsze1 muszą przekazać widok rodzica (drugi parametr), aby mógł on ustalić, który LayoutParams podklasa do utworzenia wystąpienia.
1: zawsze są1 wyjątki

.inflate (R.layout.header, lv, fałszywe)

Aby uzyskać więcej informacji na ten temat, bardzo proponuję: http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ (warto przeczytać nawet kilka razy)

Twój pełny zmodyfikowany kod (pliki xml mogą pozostać niezmienione):

public class MainActivity extends Activity {
    private static final String[] ADAPTER_DATA = {
            "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola"
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView list = (ListView) findViewById(R.id.list);
        View header = getLayoutInflater().inflate(R.layout.header, list, false);

        list.addHeaderView(header, null, false);
        list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, ADAPTER_DATA));
    }
}

15
2017-09-16 11:04



Dziękuję, że to rozwiązało mój problem! Problem w moim przypadku był po prostu parametrem "false" w nagłówku View header = getLayoutInflater (). Inflate (R.layout.header, list, false); ! - Recomer


Oto jak dodaję nagłówek:

    View view = View.inflate(context, R.layout.header, null);
    lv = (ListView) findViewById(R.id.list);


    lv.addHeaderView(view);

12
2017-10-22 05:48



Myślę, że akcja "nadmuchiwania" jest równoważna, bardzo dziękuję, ale to nie pomogło. - user1764413
@laura jak można się dostaćKliknij na elementy nagłówka? - Kenji


Sprawdź to, teraz działam poprawnie:

    ListView lv = (ListView)findViewById(R.id.list);

    LayoutInflater layoutInflater = this.getLayoutInflater();
    View headerView = (View) layoutInflater.inflate(R.layout.header, lv, false);

Po prostu wyślij listview do drugiego parametru metody nadmuchania :)


2
2017-12-18 22:42





Powinieneś zadeklarować widok nagłówka w oddzielnym pliku xml. Następnie nadmuchaj go do instancji View i ustaw ją na ListView.

View view = ... (inflate the view from xml file)
listview.addHeaderView(view)

Musisz wywołać addHeaderView przed setAdapter do widoku listy.


1
2017-10-22 05:54



tak, tak jak kod, który publikuję, deklaruję header.xml jako oddzielny plik xml. i wzywam addHeaderView przed setAdapter do widoku listy. - user1764413
Przyjrzyjmy się samcoles.co.uk/mobile/.... Mam nadzieję że to pomoże. - Nguyen Minh Binh