2013-02-18 3 views
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; 
    } 
} 

Моя проблема заключается в том, что просмотр списка не отображается. Пожалуйста помоги.

+0

вы никогда не выполняете вызов setAdapter в экземпляре ListView – Blackbelt

+0

можете ли вы рассказать мне, как это сделать, этот код также извлекает изображение, но я не хочу печатать изображение, поэтому удаляем код, который загружает изображение. Скажите мне, куда я пошел неправильно. – 2013-02-18 09:33:42

ответ

0

Так что здесь очень грязный код, и самое главное подумать, что вы никогда не звоните setAdapter на свой ListView. Сделайте это, и он должен работать.

Также мое предложение заключается в том, что ваш первый создать и инициализировать экземпляр ListView, а также установить Adapter для ListView с пустым List. Создать подкласс BaseAdapter, чтобы получить больше контроля над Adapter и передать List с помощью конструктора:

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 при загрузке какой-то элемент с сервера, добавьте его в List и вызвать yourAdapter.notifyDataSetChanged() на вашем Adapter.

Пример: Android ListView.

+0

скажите мне, где это сделать, можете ли вы изменить приведенный выше код? – 2013-02-18 09:34:18

+0

в 'onPostExecute()' в классе ListViewLoaderTask. – Sajmon

+0

Большое спасибо, но приведенная выше ссылка также загружает изображения, которые я не хочу, чтобы вы могли сказать мне, какую часть в коде комментировать и какую часть сохранить? – 2013-02-18 09:46:58

0

В OnPostExecute в ListViewLoaderTask добавить mListView.setAdapter(adapter);

С другой стороны, вы ничего с результатом не делает. Вы просто позвоните

SimpleAdapter adapter = mListView.getAdapter(); 

, а затем верните его в список. Это ничего не значит. Вы должны заполнить адаптер полученными данными.

Смежные вопросы