dany84
dany84

Reputation: 251

Is it possible to disable scroll on a listView?

I dynamically add items to a ListView and want to make all the items always visible, without scrolling.

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>

old OnCreate() function code:

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

If I move code related to fill my spinner with database data, it always returns me a NullPointerException as it's not found in my layout. So I need to keep it here and the solution adding addHeaderView() to my ListView seems to be ok, but I have another NullPointerException regarding my head 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();
}

Upvotes: 9

Views: 11178

Answers (3)

Michał Klimczak
Michał Klimczak

Reputation: 13154

If I understand you well, you just need some more views wich are scrollable along with your listview. The best way to implement it is to call addHeaderView() and addFooterView() on your ListView().

EDIT:

It should go like this, I think:

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

}

I'm writing from memory and didn't test it, but I think it should work. Try it out when you get a moment.

Upvotes: 4

MRD
MRD

Reputation: 7184

One solution is to do the ListView height as big as the content. You can achieve this effect using the following class instead of 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);
  }

}

Anyway, it's a bad idea to have a ListView within a ScrollView, so I would add the other elements in your Layout as a header/footer view with the methods addHeaderView() and addFooterView() as MichałK pointed out.

Here you have an example about how to use these methods:

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

Upvotes: 2

Trikaldarshiii
Trikaldarshiii

Reputation: 11314

Make your ListView height bigger than your content size.

say if You have 5 listitems each having 20sp height set list view height to 100 or greater this way you can achieve it

Upvotes: 1

Related Questions