0

TabActivityでは、1つのTabSpecはいくつかのTextViewと、それ以下のListView要素で構成されます。ListViewに外部データベースからのAsyncTaskを入力したいと思います。「標準」レイアウトのアプリの他のすべての部分では、これは正常に機能しますが、ここでは、ネストされたListViewが問題を引き起こしているようです。データを(おそらくTabSpecのListViewに)ロードすると、アプリは代わりにTabActivityの上に新しい「ウィンドウ」を作成するため、「戻る」ボタンを押すと(空の)TabSpecに戻ります。

これが私のコードです:

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>

ListViewを使用したTabSpec(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>

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

}

}

そして、ここに私の問題の原因(しゃれを意図したもの)があるに違いないと思う部分があります-ListViewを適切に入力して表示するためにTabSpecを設定する背後にあるコード:

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

        }

    }
}

}

コメントListViewを個別に開いたウィンドウ/アクティビティではなくTabSpec内に表示するために修正する必要があるアイデアはありますか?

4

3 に答える 3

0

リストビューは、ListActivityではなくActivityで定義されます。アダプターの設定方法が異なります...

たぶん、アダプタを設定するためのあなたの呼び出しは次のようになります:

lvComments.setAdapter(laComments);

または、ActivityではなくListActivityに変更します。

于 2012-06-02T13:31:49.003 に答える
0

ListActivity Inside Activityを呼び出すと、uの新しいウィンドウが作成されます。これを回避するには、ListActivity(GetVenueComments)をTabActivity(VViewActivity)に直接登録します。以下で確認します。

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, GetVenueComments.class);
vreviewsspec.setContent(vreviewsIntent);

// Adding all TabSpec to the TabHost for display
tabHost.addTab(vinfospec);
tabHost.addTab(vmapspec);
tabHost.addTab(vreviewsspec);

 tabHost.setCurrentTab(2);

 }

}



public static class GetVenueComments extends ListActivity {
JSONParser jParser = new JSONParser();
JSONArray comments = null;

private RatingBar ratingBar;
private TextView txtvname_r;
private Button btnRatingSubmit;
private ListView lvComments;
private static ListAdapter laComments;
String vid;
String vname;
String rating;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.venueviewreviews);

    ListView lvComments = (ListView)findViewById(R.id.list);

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

    }

  }
 }
于 2012-06-05T06:09:38.523 に答える
0

私は解決策を見つけたと思います。どういうわけかTabHost/TabSpecはビューを非常に異なる方法で処理するため、TabHostに入力されるListView以外のTextViewまたは別の要素があると、コンテキストスタックが台無しになります。

したがって、「Chris」がここで説明しているように、オーバーライドされたonContentChanged()メソッドでButtonsとTextViewsを参照する変数を更新することでした。

@Override
public void onContentChanged() {
    // refresh with current view, otherwise NullPointerException on
    // OnPostExecute() when trying to set value of the field with
    // setText()!!
    super.onContentChanged();

    btnRatingSubmit = (Button) VViewReviewsActivity.this
            .findViewById(R.id.btnRatingSubmit);
    txtvname_r = (TextView) VViewReviewsActivity.this
            .findViewById(R.id.txtvname_r);
    ratingBar = (RatingBar) VViewReviewsActivity.this
            .findViewById(R.id.ratingBar);
}
于 2012-06-06T03:16:20.463 に答える