2012-06-05 13 views
8

Dinamik olarak öğeleri bir ListView ürününe ekliyorum ve kaydırma yapmadan tüm öğelerin her zaman görünür olmasını istiyorum.Listede kaydırma devre dışı bırakmak mümkün mü?

Düzen Kodu:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/recipe_inside" 
android:orientation="vertical" > 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

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

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="41dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="5dp" 
      android:text="Remember to save before leaving this page or inserted/modified data will be lost." 
      android:textColor="#000000" 
      android:textSize="13dp" /> 

     <ImageView 
      android:id="@+id/ImageView01" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView01" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Category" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 

     <Spinner 
      android:id="@+id/category_spinner" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <ImageView 
      android:id="@+id/ImageView02" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView02" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Name" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 

     <EditText 
      android:id="@+id/recipe_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="Recipe title" android:lines="1"/> 

     <ImageView 
      android:id="@+id/ImageView03" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView03" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Ingredients" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 
     <ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" android:cacheColorHint="#00000000" android:divider="#00000000" 
      android:isScrollContainer="false" 
      > 
     </ListView> 

     <Button 
      android:id="@+id/button_ing" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" android:background="@drawable/add_recipe_button" android:onClick="addItems"/> 

    </LinearLayout> 

</ScrollView></LinearLayout> 

eski OnCreate() fonksiyonu kodu: o değil olarak

protected void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.add_recipe_form); 

    spinner = (Spinner)myhead.findViewById(R.id.category_spinner); 

    Cursor cursor = mydb.getCategoriesList(); 
    ArrayList<Category> list = new ArrayList<Category>(); 
    list.add(new Category(0,"Choose a category")); 

    while (cursor.moveToNext()) { 
     list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    } 
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects 
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list); 

    // Step 3: Tell the spinner about our adapter 
    spinner.setAdapter(spinnerArrayAdapter); 
    spinner.setOnItemSelectedListener(this); 


    setListAdapter(adapter); 
    ingredients.add((View)findViewById(R.layout.row_add_recipe)); 
    adapter.notifyDataSetChanged(); 
} 

ben kod veritabanı verilerle benim spinner doldurmak için ilgili taşırsanız, her zaman bana bir NullPointerException döndürür benim düzenimde bulundu. Yani burada tutmak gerekir ve benim ListView için addHeaderView() ekleyerek çözüm ok gibi görünüyor, ama ben başım düzeni ile ilgili bir başka NullPointerException vardır:

protected void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.add_recipe_form); 
    ListView mylistview = (ListView) findViewById(android.R.id.list); 
    LinearLayout myhead = (LinearLayout)findViewById(R.id.linear_form); 
    mylistview.addHeaderView(myhead); 
    spinner = (Spinner)myhead.findViewById(R.id.category_spinner); 

    Cursor cursor = mydb.getCategoriesList(); 
    ArrayList<Category> list = new ArrayList<Category>(); 
    list.add(new Category(0,"Choose a category")); 

    while (cursor.moveToNext()) { 
     list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    } 
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects 
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list); 

    // Step 3: Tell the spinner about our adapter 
    spinner.setAdapter(spinnerArrayAdapter); 
    spinner.setOnItemSelectedListener(this); 


    setListAdapter(adapter); 
    ingredients.add((View)findViewById(R.layout.row_add_recipe)); 
    adapter.notifyDataSetChanged(); 
} 
+0

'kaydırma yapmadan tüm öğeleri görünür yap 'Ekran boyutundan daha fazla öğeniz varsa ne olur? –

+0

bunu daha ayrıntılı olarak açıklayabilir misiniz? Ekranın görünmesi için çok fazla öğe eklediğinizde, öğeleriniz nasıl görüntülenmelidir (ör. 100 öğe eklediniz)? – Sprigg

+0

Liste listemi, içinde ScrollView içinde bulunan başka öğelere sahip bir Linearlayout içinde. Bir ScrollView içinde – dany84

cevap

4

elde edebilirsiniz varsa

Ben iyi anlıyorum, sadece biraz daha ihtiyacım demek görünümleri, liste görünümünüzle birlikte kaydırılabilir. Uygulamanın en iyi yolu, ListView() numaranıza addHeaderView() ve addFooterView() numaralarını aramaktır.

DÜZENLEME: bellekten yazıyorum ve bunu test etmedi

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_main_layout); 
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View header = inflater.inflate(R.layout.your_header_layout); //R.layout, not R.id! 

    (ListView) list = findViewById(android.R.list); 
    list.addHeaderView(header); 

    list.setAdapter(adapter); //according to docs you should call setAdapter() after addHeaderView() 

    //to get the spinner 
    (Spinner) spinner = (Spinner) header.findViewById(R.id.spinner); 

} 

, ama çalışması gerekir düşünüyorum:

Böyle gitmeli diye düşünüyorum. Bir an aldığında dene.

+0

Bu ilginç. Başım için yeni bir XML düzen dosyası oluşturdum ama bu kodu kullandığımda: LinearLayout myhead = (LinearLayout) findViewById (R.id.linear_form); Bana "boş" değerini döndürür. Herhangi bir fikir? – dany84

+0

Nerede diyorsunuz? Etkinliğinizin onCreate() 'ında? –

+0

evet, OnCreate() üzerinde diyorum. Eğer yararlı olabilirse, OnCreate() işlevimin bir parçası: setContentView (R.layout.add_recipe_form); \t \t ListView mylistview = (ListView) findViewById (android.R.id.list); \t \t LinearLayout myhead = (LinearLayout) findViewById (R.id.linear_form); \t \t mylistview.addHeaderView (myhead); – dany84

2

bir çözüm gibi büyük ListView yüksekliğini yapmaktır içerik. Bir scrollview içinde bir ListView olması kötü bir fikir, neyse

public class ExpandedListView extends ListView { 

    private int old_count = 0; 

    public ExpandedListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    if (getCount() != old_count) { 
     old_count = getCount(); 
     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < getCount(); i++) { 
      View listItem = getAdapter().getView(i, null, this); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

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

    super.onDraw(canvas); 
    } 

} 

, bu yüzden bir üst bilgi/alt görünüm olarak Düzeni diğer elementler eklersiniz: Sen ListView yerine şu sınıfını kullanarak bu etkiyi elde edebilirsiniz MichałK olarak addHeaderView() ve addFooterView() yöntemleriyle işaret etti.

https://github.com/commonsguy/cw-advandroid/tree/master/ListView/HeaderFooter

+0

Liste görünümünde belirli öğeleri almanıza gerek yok. addHeaderView() 've' addFooterView() 'hile kolaylaştırır. –

+0

Bu üstbilgi/altbilgi sabit ve daima görünür durumda mı? Sanırım herşeyin kaydırılabilir olmasını istiyor. –

+0

Bunlar kaydırılabilir, yalnızca listeye bir satır olarak eklenen bazı özel görünümler. Ayrıca, bunlardan birkaçını ekleyebilir veya sadece diğer görünümleri olan bir "LinearLayout" yazabilirsiniz, bu yüzden güzel, özelleştirilebilir bir çözümdür –

1

sizin içerik boyutu daha büyük senin ListViewyüksekliği olun:

Burada bu yöntemleri nasıl kullanılacağı hakkında bir örnek vardır. Sen 5 ListItems her sahip 20sp yüksekliği seti liste görünümü yükseklik 100 veya bu şekilde daha bunu

+0

Bu şekilde, kaydırılamaz bir 'ListView 'elde edebilir, ancak' ListView'’in bazı görünümlerini görmek ve ilerlemek için nihai hedefe ulaşmak için daha iyi yollar vardır. Daha önce de değinildiği gibi, 'ScrollView' içinde' ListView' öğesini koymak kötü bir fikirdir –

+1

Bu, otomatik olarak cevapta kopyaladığım ExpandedListView ile elde edilebilir, ancak bu en uygun seçenek değildir. –

+0

Yeni bir öğe ekledikçe, liste görünümümün düzen paramlarını değiştirmeye çalışan bir ClassCastException alıyorum. – dany84

İlgili konular