2

シンプルなデータをNAMEとしてWebサーバーに送信し、サーバーからNAMESを取得できるAndroidアプリを開発しています。Web サービスに php と mysql を使用します。現在、ウェブからアンドロイドへのデータの送受信は完了しています。今、私は自分のウェブサイト データベースから取得した名前を Android リストビューに表示したいと考えています。以下は私のコードです

public class allProducts extends ListActivity {

// Progress Dialog
private ProgressDialog pDialog;

// Creating JSON Parser object
JSONParser jParser = new JSONParser();

ArrayList<HashMap<String, String>> productsList;

// url to get all products list
private static String url_all_products = "http://10.0.2.2/dinein/Model/getName.php";

// JSON Node names

private static final String TAG_NAME = "name";
//private static final String TAG_SUCCESS = "success";
//private static final String TAG_PRODUCTS = "products";
//private static final String TAG_PID = "pid";

// products JSONArray
JSONArray products = null;
static ArrayList<String> listItems=new ArrayList<String>();

//DEFINING STRING ADAPTER WHICH WILL HANDLE DATA OF LISTVIEW
ArrayAdapter<String> adapter;

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


    // Hashmap for ListView
    productsList = new ArrayList<HashMap<String, String>>();

    // Loading products in Background Thread
    new LoadAllProducts().execute();

    // Get listview
    ListView lv = getListView();

    // on seleting single product
    // launching Edit Product Screen
   /* lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                    .toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(),
                    EditProductActivity.class);
            // sending pid to next activity
            in.putExtra(TAG_PID, pid);

            // starting new activity and expecting some response back
            startActivityForResult(in, 100);
        }
    });*/

}

// Response from Edit Product Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // if result code 100
    if (resultCode == 100) {
        // if result code 100 is received
        // means user edited/deleted product
        // reload this screen again
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

}

 class LoadAllProducts extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(allProducts.this);
        pDialog.setMessage("Loading products. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json =jParser.makeHttpRequest(url_all_products, "POST", params);

        // Check your log cat for JSON reponse




            // Checking for SUCCESS TAG
            int success = 1;

            if (success == 1) {
                Iterator<String> iter = json.keys();
                Object value=null;
                while (iter.hasNext()) {
                    String key = iter.next();
                    try {
                         value = json.get(key);


                    } catch (JSONException e) {
                        // Something went wrong!
                    }
                }

              }



        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        allProducts.this, productsList,
                        R.layout.name_list, new String[] {TAG_NAME},
                        new int[] { R.id.pid, R.id.name });
                // updating listview
                setListAdapter(adapter);
            }
        });

    }

}

リスト ビューを使用して、アクティビティにデータを表示したいと考えています。私のxmlファイルは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

そしてもう一つ

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
    android:id="@+id/pid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:visibility="gone" />

</RelativeLayout>
4

2 に答える 2

1

拡張する場合はListActivity、ListViewIDを次のように変更する必要がありますandroid:id="@+id/android:list"。xmlを次のように変更します。

<ListView
    android:id="@+id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

onPostExecute常にで実行されるため、onPostExecuteメソッドコードを次のように変更するメソッドからUIを更新するためMain UI Threadに使用する必要はありません。runOnUiThreadonPostExecutedoInBackground

protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();

        ListAdapter adapter = new SimpleAdapter(
                        allProducts.this, productsList,
                        R.layout.name_list, new String[] {TAG_NAME},
                        new int[] { R.id.pid, R.id.name });

               ListView listview = allProducts.this.getListView();
                // updating listview
                listview.setListAdapter(adapter);
    }
于 2013-03-07T12:19:20.997 に答える
0

あなたのコードに 2 つの間違いを見つけました。

まず、行のテキストビューの可視性が GONE に設定されているため、リストに何も表示されません。だから、それを変更します。

<TextView
     android:id="@+id/pid"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
    <!-- android:visibility="gone" -->
 />

次に、リスト行には field(R.id.pid) が 1 つしかなく、コードは2 つの fields(R.id.pid, R.id.name) を設定しようとしています。すぐに、2 つ変更するか、別のテキストビューを追加するandroid:id ="@+id/name"か、アダプターの R.id.name を削除します。

pid フィールドのみを使用して動作する例を次に示します。

   List<Map<String, String>> productsList = new ArrayList<Map<String,String>>();
   HashMap<String, String> p1 = new HashMap<String, String>();
   p1.put("key", "product1");
   HashMap<String, String> p2 = new HashMap<String, String>();
   p2.put("key", "product2");
   HashMap<String, String> p3 = new HashMap<String, String>();
   p3.put("key", "product3");
   productsList.add(p1);
   productsList.add(p2);
   productsList.add(p3);


   ListAdapter adapter = new SimpleAdapter(this, productsList,
            R.layout.row, new String[] {"key"},
            new int[] { R.id.pid});

   ListView listview = getListView();
   listview.setAdapter(adapter);
于 2013-03-07T13:35:02.693 に答える