0

嗨,我创建了一个 android 应用程序,它以列表的形式显示来自 mysql db 的数据。

这是代码。

public class MainActivity extends Activity {

    ListView mListView;

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

        // URL to the JSON data         
        String strUrl = "http://192.168.2.3/Flutura/PHP/Core/Data/android.data.php";

        // Creating a new non-ui thread task to download json data 
        DownloadTask downloadTask = new DownloadTask();

        // Starting the download process
        downloadTask.execute(strUrl);

        // Getting a reference to ListView of activity_main
        mListView = (ListView) findViewById(R.id.lv_countries);


    }

    /** A method to download json data from url */
    private String downloadUrl(String strUrl) throws IOException{
        String data = "";
        InputStream iStream = null;
        try{
                URL url = new URL(strUrl);

                // Creating an http connection to communicate with url 
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url 
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

                StringBuffer sb  = new StringBuffer();

                String line = "";
                while( ( line = br.readLine())  != null){
                    sb.append(line);
                }

                data = sb.toString();

                br.close();

        }catch(Exception e){
                Log.d("Exception while downloading url", e.toString());
        }finally{
                iStream.close();
        }

        return data;
    }



    /** AsyncTask to download json data */
    private class DownloadTask extends AsyncTask<String, Integer, String>{
        String data = null;
                @Override
                protected String doInBackground(String... url) {
                        try{
                            data = downloadUrl(url[0]);

                        }catch(Exception e){
                            Log.d("Background Task",e.toString());
                        }
                        return data;
                }

                @Override
                protected void onPostExecute(String result) {

                        // The parsing of the xml data is done in a non-ui thread 
                        ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();

                        // Start parsing xml data
                        listViewLoaderTask.execute(result);                        

                }
    }

    /** AsyncTask to parse json data and load ListView */
    private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{

        JSONObject jObject;
        // Doing the parsing of xml data in a non-ui thread 
        @Override
        protected SimpleAdapter doInBackground(String... strJson) {
            try{
                jObject = new JSONObject(strJson[0]);
                CountryJSONParser countryJsonParser = new CountryJSONParser();
                countryJsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("JSON Exception1",e.toString());
            }

            // Instantiating json parser class
            CountryJSONParser countryJsonParser = new CountryJSONParser();

            // A list object to store the parsed countries list
            List<HashMap<String, Object>> countries = null;

            try{
                // Getting the parsed data as a List construct
                countries = countryJsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("Exception",e.toString());
            }          

            // Keys used in Hashmap 
            String[] from = { "outlet_id","outlet_name","lat","lng","outlet_location"};

            // Ids of views in listview_layout
            int[] to = { R.id.tv_country,R.id.iv_flag,R.id.tv_country_details};

            // Instantiating an adapter to store each items
            // R.layout.listview_layout defines the layout of each item         
            SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), countries, R.layout.lv_layout, from, to);  

            return adapter;
        }

       /* /** Invoked by the Android on "doInBackground" is executed 
        @Override
        protected void onPostExecute(SimpleAdapter adapter) {

            // Setting adapter for the listview
            mListView.setAdapter(adapter);

          /*  for(int i=0;i<adapter.getCount();i++){
                HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i);
                String imgUrl = (String) hm.get("flag_path");
                //ImageLoaderTask imageLoaderTask = new ImageLoaderTask();

                HashMap<String, Object> hmDownload = new HashMap<String, Object>();
                hm.put("flag_path",imgUrl);
                hm.put("position", i);

                // Starting ImageLoaderTask to download and populate image in the listview 
                //imageLoaderTask.execute(hm);
            }   
        }       
    }*/
  /*  
    /** AsyncTask to download and load an image in ListView 
    private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{

        @Override
        protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) {

            InputStream iStream=null;
            String imgUrl = (String) hm[0].get("flag_path");
            int position = (Integer) hm[0].get("position");

            URL url;
            try {
                url = new URL(imgUrl);

                // Creating an http connection to communicate with url
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url                
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                // Getting Caching directory 
                File cacheDirectory = getBaseContext().getCacheDir();

                // Temporary file to store the downloaded image 
                File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+position+".png");               

                // The FileOutputStream to the temporary file
                FileOutputStream fOutStream = new FileOutputStream(tmpFile);

                // Creating a bitmap from the downloaded inputstream
                Bitmap b = BitmapFactory.decodeStream(iStream);             

                // Writing the bitmap to the temporary file as png file
                b.compress(Bitmap.CompressFormat.PNG,100, fOutStream);              

                // Flush the FileOutputStream
                fOutStream.flush();

                //Close the FileOutputStream
                fOutStream.close();             

                // Create a hashmap object to store image path and its position in the listview
                HashMap<String, Object> hmBitmap = new HashMap<String, Object>();

                // Storing the path to the temporary image file
                hmBitmap.put("flag",tmpFile.getPath());

                // Storing the position of the image in the listview
                hmBitmap.put("position",position);              

                // Returning the HashMap object containing the image path and position
                return hmBitmap;                


            }catch (Exception e) {              
                e.printStackTrace();
            }
            return null;
        }
*/      
        protected void onPostExecute(HashMap<String, Object> result) {
            // Getting the path to the downloaded image
            //String path = (String) result.get("flag");            

            // Getting the position of the downloaded image
            //int position = (Integer) result.get("position");

            // Getting adapter of the listview
            SimpleAdapter adapter = (SimpleAdapter ) mListView.getAdapter();

            // Getting the hashmap object at the specified position of the listview
            //HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(position); 

            // Overwriting the existing path in the adapter 
            //hm.put("flag",path);

            // Noticing listview about the dataset changes
            adapter.notifyDataSetChanged(); 
        }


    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
}

这是我使用 JSONParser 解析数据的类。

/** A class to parse json data */
public class CountryJSONParser {

    // Receives a JSONObject and returns a list
    public List<HashMap<String,Object>> parse(JSONObject jObject){      

        JSONArray jCountries = null;
        try {       
            // Retrieves all the elements in the 'countries' array 
            jCountries = jObject.getJSONArray("countries");
        } catch (JSONException e) {
            e.printStackTrace();
        }

         // Invoking getCountries with the array of json object
         // where each json object represent a country
        return getCountries(jCountries);
    }


    private List<HashMap<String, Object>> getCountries(JSONArray jCountries){
        int countryCount = jCountries.length();
        List<HashMap<String, Object>> countryList = new ArrayList<HashMap<String,Object>>();
        HashMap<String, Object> country = null; 

        // Taking each country, parses and adds to list object 
        for(int i=0; i<countryCount;i++){
            try {
                // Call getCountry with country JSON object to parse the country 
                country = getCountry((JSONObject)jCountries.get(i));
                countryList.add(country);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        return countryList;
    }

    // Parsing the Country JSON object 
    private HashMap<String, Object> getCountry(JSONObject jCountry){

        HashMap<String, Object> country = new HashMap<String, Object>();
        String countryName = "";
        String flag="";
        String language = "";
        String capital = "";
        String location = "";
        //String currencyCode = "";
        //String currencyName = "";     

        try {
            countryName = jCountry.getString("outlet_id");
            flag = jCountry.getString("outlet_name");
            language = jCountry.getString("lat");
            capital = jCountry.getString("lng");
            location = jCountry.getString("outlet_location");
            //currencyCode = jCountry.getJSONObject("outlet_image").getString("outlet_image");
            //currencyName = jCountry.getJSONObject("outlet_location").getString("outlet_location");

            String details =        "Language : " + language + "\n" +
                    "Capital : " + capital + "\n" ;
                   // "Currency : " + currencyName + "(" + currencyCode + ")";

            country.put("country", countryName);
            //country.put("flag", R.drawable.blank);
            country.put("flag_path", flag);
            country.put("details", details);

        } catch (JSONException e) {         
            e.printStackTrace();
        }       
        return country;
    }
}

我的问题是列表视图没有显示。请帮忙。

4

2 回答 2

0

所以这里有很多乱七八糟的代码,最重要的是你永远不会调用setAdapter你的ListView. 这样做,它应该工作。

另外我的建议是您首先创建和初始化ListView实例,并设置AdapterListViewList。创建子类BaseAdapter以获得更多控制权AdapterList通过构造函数传递:

public MyAdapter extends BaseAdapter {

   public MyAdapter(Context c, int layout, List<HashMap<String, Object>> countries) {

   }

   // implement methods as getItem, getItemId, ...


   public View getView(int position, View convertView, ViewGroup parent) {
      if (convertView == null) {
          // inflate row, use RowHolder design pattern to hold data of each row in
          // wrapping object like RowHolder and set it as tag to convertView
      }
      else {
        //get existing tag from convertView
      }
      if (!countries.isEmpty()) {
        // set data to elements in row

      }
   }
}

当您AsyncWorker从服务器下载某些项目时,将其添加到ListyourAdapter.notifyDataSetChanged()Adapter.

这里是例子:Android ListView

于 2013-02-18T09:32:49.150 回答
0

在添加OnPostExecute_ListViewLoaderTaskmListView.setAdapter(adapter);

另一方面,你没有对结果做任何事情。你只要打电话

SimpleAdapter adapter = mListView.getAdapter();

然后将其设置回列表视图。这基本上什么都不做。您必须使用检索到的数据填充适配器。

于 2013-02-18T09:38:21.977 回答