Reputation: 8959
Im trying to add a list view to my activity. Here is what is suppose to happen: The user clicks on a button and that uses an asyncTask to get data from the internet. That data should then be added to the list view. The data comes from a table online therefore it there are 10 rows in the table then there should be 10 values in the Listview.
But I'm having some problems. First of all can a listview be added to a pre-existing layout and be updated on the fly?
Does a list view mean you cannot use the setContentView() method and have to use setListAdapter?
Thanks
Edit
Updated Code - Which works:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView( R.layout.new_sightings );
ListView list = getListView();
list.setAdapter( new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, values ) );
list.setTextFilterEnabled( true );
}
XML Layout
?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation = "vertical">
<TableLayout
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
>
<TableRow
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:layout_weight = "1"
>
<TextView
android:id = "@+id/txtTitle"
android:layout_width = "wrap_content"
android:layout_height = "fill_parent"
android:layout_weight = "1"
android:gravity = "center"
android:text = "ISS Predictions"
android:textStyle="bold"
android:textColor = "#FFFFFF"
/>
<Button
android:id="@+id/reloadTen"
android:layout_height="wrap_content"
android:layout_width ="fill_parent"
android:layout_gravity = "right"
android:layout_weight = "1"
android:text = "Reload"
android:textColor = "#FFFFFF"
android:textStyle = "bold"
android:background = "#000000"
/>
</TableRow>
</TableLayout>
<ListView
android:id = "@+id/android:list"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:textSize = "15dp"
android:textStyle = "bold"
/>
</LinearLayout>
Upvotes: 0
Views: 249
Reputation: 6591
You can create a ListView as a part of any XML layout. You needn't extend ListActivity (which I think is where you're getting the idea from) but it can help.
If you don't extend ListActivity, you can setContentView to the ID of whichever layout you have already created (and contains your ListView).
1) Yes, you can add a listview to a pre-existing layout, either statically or on-the-fly (by either LayoutInflater inflation or new ListView(...)).
2) You can use setContentView to set an existing layout, whether it contains a listview or not. If it contains an existing listview you'll need to say findViewById(R.id.myListLayoutId) and make sure to include in your XML.
3) You can add the listview to an existing layout, either before or after anything that already exists, by specifying the index at which you'd like to myExistingView.addView(listView, index).
In any case you will need to set an adapter on the listview (however you have created/added it) which will contain the data to be populated. You can add data to the adapter at any time so long as you notify the adapter that its data set has changed by calling adapter.notifyDataSetChanged(). This will cause the listview whose adapter it is to be updated.
Upvotes: 1
Reputation: 37506
1) Yes, you can have a ListView
in your layout, and update the data displayed by the ListView
. Typically you'd make a class that inherits from ArrayAdapter to bridge the gap between your underlying data and generating views for your ListView
.
When you want to update the data displayed, use add() and notifyDataSetChanged() on your adapter.
2) No. You call setListAdapter()
only when your activity inherits from ListActivity
and you have a ListView
element with an id of @android:id/list
. Here's an example of such an element:
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
You still use setContentView()
to pass in the desired XML layout to use.
3) Yes, for the reasons explained above.
Upvotes: 2