SORU
13 EYLÜL 2012, PERŞEMBE


Bir ListAdapter ScrollView bir düzen içinde bir LinearLayout doldurmak için kullanma

Çok yaygın bir sorunla karşı karşıyayım: Bir etkinliği ben koydu ve şimdi ScrollView Bu içinde birkaç öğe görüntüleme gerektiği ortaya çıktı. Mevcut kullanmak olacaktır bunu normal yoldan ListAdapter, bağla ListView veBOOMÖğeleri listeme alırdım.

AMABu Tüysüz bu durumdan şikayetçi bile Android kadar kaydırma vida - ScrollView ListView iç içe geçmiş bir yer değil.

Burada benim sorum şu:

Nasıl LinearLayout ListAdapter ya da benzer bir şey bağlarım?

Bu çözüm öğeleri bir sürü için ölçek olmaz ama listem çok kısa olduğunu biliyorum (&; 10 lt öğeleri) görüş reusage gerçekten gerekli değildir. Performans bilge I LinearLayout doğrudan tüm görüşlerini yerleştirme ile yaşayabilir.

Aklıma gelen tek çözüm ListView headerView bölümünde mevcut benim etkinlik düzeni yer olacaktır. Ama bu temiz bir çözüm arıyorum yani bu mekanizma, taciz gibi geliyor.

Fikirler?

GÜNCELLEME:Doğru yönde telkin etmek üzere, benim sorunum göstermek için örnek bir düzen ekleyin:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@ id/news_detail_layout"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:visibility="visible">


    <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#FFF"
            >

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical"
                android:paddingLeft="@dimen/news_detail_layout_side_padding"
                android:paddingRight="@dimen/news_detail_layout_side_padding"
                android:paddingTop="@dimen/news_detail_layout_vertical_padding"
                android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
                >

            <TextView
                    android:id="@ id/news_detail_date"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:gravity="center_horizontal"
                    android:text="LALALA"
                    android:textSize="@dimen/news_detail_date_height"
                    android:textColor="@color/font_black"
                    />

            <Gallery
                    android:id="@ id/news_detail_image"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:paddingTop="5dip"
                    android:paddingBottom="5dip"
                    />

            <TextView
                    android:id="@ id/news_detail_headline"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:gravity="center_horizontal"
                    android:text="Some awesome headline"
                    android:textSize="@dimen/news_detail_headline_height"
                    android:textColor="@color/font_black"
                    android:paddingTop="@dimen/news_detail_headline_paddingTop"
                    android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
                    />

            <TextView
                    android:id="@ id/news_detail_content"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent"
                    android:text="Here comes a lot of text so the scrollview is really needed."
                    android:textSize="@dimen/news_detail_content_height"
                    android:textColor="@color/font_black"
                    />

            <!---
                HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER. 
                They should be positioned at the end of the content, so making the scrollview smaller is not an option.
            ---->                        

        </LinearLayout>
    </ScrollView>
</LinearLayout>

GÜNCELLEME 2Bunu daha kolay anlamak için yapmak için başlık (bir downvote, doh!) değiştirdim.

CEVAP
13 EYLÜL 2012, PERŞEMBE


Muhtemelen sadece el ile LinearLayout öğeler eklemek gerekir:

LinearLayout layout = ... // Your linear layout.
ListAdapter adapter = ... // Your adapter.

final int adapterCount = adapter.getCount();

for (int i = 0; i < adapterCount; i  ) {
  View item = adapter.getView(i, null, null);
  layout.addView(item);
}

EDİT: Önemsiz olmayan yaklaşık 200 liste öğeleri görüntülemek için gereken zaman, çok yavaş Nexus 4 yaklaşık 2 saniye benim "" bu kabul edilemez. listesini görüntülemek için gerekli bu yaklaşımı kabul etmedim Başlıkları ile Flo yaklaşım döndü. Liste görünümleri kullanıcı verilirse, o zaman view oluşturulduğunda talep oluşturulduğu için çok daha hızlı çalışıyor.

Devam:Manuel ayrıca manzarası düzeni daha kolay kod (böylece potansiyel olarak daha az hareketli parça ve böcekler), ama uğrar performans sorunları, bu yüzden eğer senin gibi 50 veya daha fazla görüş, tavsiye ederim kullanın başlığındaki yaklaşım.

Örnek. Temelde (veya parça) faaliyet düzeni böyle bir şey (ScrollView artık gerekli) dönüştürür:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@ id/my_top_layout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"/>

Sonra onCreateView() (çıkayım bir örnek ile bir parça) eklemek için bir başlık görüntülemek ve ayarlı bir adaptör (sanırım Başlığı kaynak KİMLİĞİ header_layout):

ListView listView = (ListView) inflater.inflate(R.layout.my_top_layout, container, false);
View header = inflater.inflate(R.layout.header_layout, null);
// Initialize your header here.
listView.addHeaderView(header, null, false);

BaseAdapter adapter = // ... Initialize your adapter.
listView.setAdapter(adapter);

// Just as a bonus - if you want to do something with your list items:
view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // You can just use listView instead of parent casted to ListView.
    if (position >= ((ListView) parent).getHeaderViewsCount()) {
      // Note the usage of getItemAtPosition() instead of adapter's getItem() because
      // the latter does not take into account the header (which has position 0).
      Object obj = parent.getItemAtPosition(position);
      // Do something with your object.
    }
  }
});

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • Majestic Casual

    Majestic Cas

    28 NİSAN 2012
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011