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();
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With