将数据从json对象显示到android listview

时间:2013-03-07 12:05:12

标签: android json

我正在开发一个Android应用程序,它将简单数据作为NAME发送到网络服务器,并可以从服务器中检索NAMES。使用php和mysql进行webservices。目前我完成了从web发送和接收数据到android。现在我想显示从我的网站数据库到我的android listview的名称。以下是我的代码

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>

2 个答案:

答案 0 :(得分:1)

如果您要扩展ListActivity,则ListView ID必须为android:id="@+id/android:list"。将您的xml更改为:

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

因为onPostExecute始终在Main UI Thread上执行,因此无需使用runOnUiThreadonPostExecute doInBackground方法更新用户界面,将onPostExecute方法代码更改为:

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

答案 1 :(得分:0)

我发现你的代码有两个错误。

首先,您无法在列表中看到任何内容,因为行的textview可见性设置为GONE 。所以,改变它。

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

其次,您的列表行只有一个字段(R.id.pid),您的代码尝试设置两个字段(R.id.pid,R.id。名)即可。很快,您有两个更改它,或添加另一个文本视图与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);