2012-06-05 15 views
8

Ich füge dynamisch Elemente zu einem ListView hinzu und möchte alle Elemente immer sichtbar machen, ohne zu scrollen.Ist es möglich, scroll auf einer listView zu deaktivieren?

Layout-Code:

<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> 

alt OnCreate() Funktionscode:

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(); 
} 

Wenn ich Code bewegen verwandte meine Spinner mit Datenbankdaten zu füllen, gibt sie mir immer ein Nullpointer wie es nicht ist in meinem Layout gefunden. Also muss ich es hier halten und die Lösung Hinzufügen addHeaderView(), um meine Listview scheint in Ordnung zu sein, aber ich habe noch eine Nullpointer in Bezug auf den Kopf Layout:

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

'machen Sie alle Elemente sichtbar, ohne zu scrollen' Was ist, wenn Sie mehr als Ihre Bildschirmgröße haben? –

+0

Könnten Sie das bitte genauer erklären? Wie sollten Ihre Artikel angezeigt werden, wenn Sie zu viele Artikel für den anzuzeigenden Bildschirm hinzufügen (z. B. 100 Artikel hinzugefügt)? – Sprigg

+0

Meine ListView befindet sich in einem Linearlayout, das andere Elemente enthält, die sich in einer ScrollView befinden. – dany84

Antwort

4

erreichen Wenn ich Sie gut verstehen, man muss nur etwas mehr Ansichten, die zusammen mit Ihrer Listenansicht scrollbar sind. Der beste Weg, um es zu implementieren, ist addHeaderView() und addFooterView() auf Ihrem ListView() zu rufen.

EDIT:

es so gehen sollte, denke ich:

@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); 

} 

ich aus dem Gedächtnis ich schreibe und habe es nicht getestet, aber ich denke, es sollte funktionieren. Probieren Sie es aus, wenn Sie einen Moment haben.

+0

Das ist interessant. Ich habe eine neue XML-Layout-Datei für meinen Kopf erstellt, aber wenn ich diesen Code verwende: LinearLayout myhead = (LinearLayout) findViewById (R.id.linear_form); es gibt mir "null" zurück. Irgendeine Idee? – dany84

+0

Wo nennst du es? In 'onCreate()' deiner Aktivität? –

+0

Ja, ich rufe es auf OnCreate(). Wenn es nützlich sein könnte, ist hier ein Teil meiner OnCreate() - Funktion: 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

Eine Lösung ist das Listview-Höhe zu tun, so groß wie der Inhalt. Sie können diesen Effekt mit Hilfe der folgenden Klasse erreichen statt Listview:

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); 
    } 

} 

Wie auch immer, es ist eine schlechte Idee ist, ein Listview innerhalb eines Scroll zu haben, so würde ich die anderen Elemente im Layout als Kopf-/Fußzeilen-Ansicht mit den Methoden addHeaderView() und addFooterView(), wie MichałK darauf hingewiesen hat.

Hier haben Sie ein Beispiel, wie diese Methoden verwenden:

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

+0

Keine Notwendigkeit, bestimmte Elemente in der Listenansicht zu erhalten. 'addHeaderView()' und 'addFooterView()' macht den Trick einfacher. –

+0

Sind diese Kopf-/Fußzeilen fest und immer sichtbar? Ich denke, er möchte, dass alles scrollbar ist. –

+0

Diese sind scrollbar, nur einige benutzerdefinierte Ansichten, die der Liste als Reihe hinzugefügt wurden. Außerdem können Sie mehrere davon hinzufügen oder einfach ein 'LinearLayout' mit anderen Ansichten einfügen, so dass es eine schöne, anpassbare Lösung ist. –

1

Machen Sie Ihre ListViewHöhe größer als Ihre Inhalt Größe.

sagen, wenn Sie haben 5 Listitem jede mit 20SP Höhe Setlist Ansicht Höhe auf 100 oder mehr diese Art und Weise können Sie es

+0

Auf diese Weise kann er eine nicht scrollbare "ListView" erreichen, aber es gibt bessere Möglichkeiten, um das ultimative Ziel zu erreichen, nämlich einige Ansichten um die "ListView" zu haben und entlang gescrollt zu werden. Wie bereits erwähnt, ist das Einfügen von 'ListView' in' ScrollView' eine schlechte Idee. –

+1

Dies kann automatisch mit der ExpandedListView erreicht werden, die ich in die Antwort kopiert habe, aber es ist alles andere als optimal. –

+0

Ich bekomme eine ClassCastException, die versucht, Layoutparameter meines Listenansichts zu ändern, während ich ein neues Element hinzufüge. – dany84

Verwandte Themen