In a TabActivity, one TabSpec consists of a few TextViews and below, a ListView element. I would like to populate the ListView with an AsyncTask from an external database. In all other parts of my app with 'standard' layouts, this works fine, but here it seems that the nested ListView creates a problem. If I load my data - supposedly into the ListView of the TabSpec - the app instead creates a new 'window' on top of the TabActivity, so the "back" button brings me back to the (empty) TabSpec.
Here is my code:
TabHost (venueview.xml):
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
</TabHost>
TabSpec with the ListView (venueviewreviews.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtvname_r"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="txtvname" />
<RatingBar
android:id="@+id/ratingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnRatingSubmit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Here is the code creating the TabHost:
public class VViewActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.venueview);
TabHost tabHost = getTabHost();
TabSpec vinfospec = tabHost.newTabSpec("Info");
vinfospec.setIndicator("Info",
getResources().getDrawable(R.drawable.ic_info));
Intent vinfoIntent = new Intent(this, VViewBasicActivity.class);
vinfospec.setContent(vinfoIntent);
TabSpec vmapspec = tabHost.newTabSpec("Map");
vmapspec.setIndicator("Location",
getResources().getDrawable(R.drawable.ic_map));
Intent vmapIntent = new Intent(this, VViewMapActivity.class);
vmapspec.setContent(vmapIntent);
TabSpec vreviewsspec = tabHost.newTabSpec("Reviews");
vreviewsspec.setIndicator("Reviews",
getResources().getDrawable(R.drawable.ic_review));
Intent vreviewsIntent = new Intent(this, VViewReviewsActivity.class);
vreviewsspec.setContent(vreviewsIntent);
// Adding all TabSpec to the TabHost for display
tabHost.addTab(vinfospec);
tabHost.addTab(vmapspec);
tabHost.addTab(vreviewsspec);
}
}
And here comes the part where I think there must be something the source of my problem (pun intended) - the code behind setting up the TabSpec with the ListView to be filled and displayed properly:
public class VViewReviewsActivity extends Activity {
private RatingBar ratingBar;
private TextView txtvname_r;
private Button btnRatingSubmit;
private ListView lvComments;
private static ListAdapter laComments;
String vid;
String vname;
String rating;
private static ArrayList<HashMap<String, String>> commentsList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.venueviewreviews);
ListView lvComments = (ListView)findViewById(R.id.list);
Intent lc = new Intent(this, GetVenueComments.class);
lc.putExtra("vid",vid);
startActivity(lc);
}
public static class GetVenueComments extends ListActivity {
JSONParser jParser = new JSONParser();
JSONArray comments = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.venueviewreviews);
commentsList = new ArrayList<HashMap<String, String>>();
new LoadAllVenues().execute();
}
/**
* Background Async Task to Load all venues via HTTP Request
* */
class LoadAllVenues extends AsyncTask<String, String, String> {
protected String doInBackground(String... args) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
Intent iCurr = getIntent();
JSONObject json = jParser.makeHttpRequest(
getString(R.string.urlVenueComments), "GET", params);
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// products found
// Getting Array of Products
comments = json.getJSONArray(TAG_COMMENTS);
// looping through All Products
for (int i = 0; i < comments.length(); i++) {
JSONObject c = comments.getJSONObject(i);
// creating new HashMap
HashMap<String, String> hashmap = new HashMap<String, String>();
// adding each child node to HashMap key => value
hashmap.put(TAG_COMMENTS_ID, cid);
hashmap.put(TAG_COMMENTS_COMMENT, ctext);
// adding HashList to ArrayList
commentsList.add(hashmap);
}
} else {
// cut to save space
}
} catch (JSONException e) {
// cut to save space
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
// Updating parsed JSON data into ListView
laComments = new SimpleAdapter(
GetVenueComments.this,
commentsList,
R.layout.commentlistitem,
new String[] { TAG_COMMENTS_ID,
TAG_COMMENTS_COMMENT }, new int[] {
R.id.CommentList_id,
R.id.CommentList_comment });
// updating listview
setListAdapter(laComments);
}
});
}
}
}
}
Any idea what I have to fix to have the comment ListView display right within the TabSpec instead of in a separately opened window/activity?