2013-11-17 4 views
0

У меня есть все данные ... Но я не могу использовать URL-адрес webview (UrlWeb), я имею в виду, когда я нажимаю на элемент списка, тогда он откроется в веб-представлении. , когда я нажимаю любой список, он должен передать соответствующий URL-адрес активности WebView. Так как этого добиться, как сохранить соответствующий URL-адрес? пожалуйста, кто-то мне помочь ..JSON listview OnItemClickListener url (webview)

Мой MainActivity:

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://www.mulnivasisangh.com/aman/listweb.json"; 

    // 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 = { "country","flag","details", "URL"}; 

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

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

     mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 
         String URL = ((TextView) view.findViewById(R.id.tv_URL)).getText().toString();//this will take the value of the invincible textView 
         Intent i = new Intent(MainActivity.this, WebViewActivity.class); 
         i.putExtra("URL", URL); 
         startActivity(i); 
         } 
}); 
    } 
    } 

/** 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; 
    } 

    @Override 
    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(); 
    } 
} 

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

}

Мой CountryJSONParser:

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("webs"); 
    } 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 web =""; 


    try { 
     countryName = jCountry.getString("Nom"); 
     flag = jCountry.getString("UrlImatge"); 
     language = jCountry.getString("Descripcio"); 
     capital = jCountry.getString("Id"); 
     web = jCountry.getString("UrlWeb"); 

     String details = "Descripcio : " + language + "\n" + 
       "Id : " + capital + "\n" + "URL: " + web + "\n"; 

     country.put("country", countryName); 
     country.put("UrlImatge", R.drawable.blank); 
     country.put("flag_path", flag); 
     country.put("details", details); 
     country.put("URL", web); 

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

}

Спасибо заранее. .

+0

вы можете прокомментировать эту строку 'imageLoaderTask.execute (hm);' он находится в 'MainActivity' чуть выше' onItemClick' и запускает приложение. то скажите мне, если у вас такая же ошибка – Coderji

+0

: D теперь он работает ... lol – Chucky

+0

ya ... с какого сайта вы получаете изображения? – Coderji

ответ

0

Я использую этот трюк, когда хочу передать данные от listview к другому действию.

1- Я добавляю textView в мой item-list.xml, который является R.layout.lv_layout в вашем случае и уменьшает видимость. android:visibility="gone"

2- добавьте ссылку String на это textView, это не будет отображаться в списке, потому что оно не имеет видимости.

String[] from = { "country","flag","details", "URL"}; 

// Ids of views in listview_layout 
int[] to = { R.id.tv_country,R.id.iv_flag,R.id.tv_country_details, R.id.tv_country_URL};//the forth one is the textView you set it as gone. 

3- в OnItemClick функция просто добавьте следующее:

String URL = ((TextView) view.findViewById(R.id.tv_country_URL)).getText().toString();//this will take the value of the invincible textView 
Intent i = new Intent(MainActivity.this, WebView.class); 
i.putExtra("URL", URL); 
startActivity(i); 

4- использовать getIntent в вашей Webview деятельности, чтобы получить URL и загрузить его.

если все еще неясный сообщите пожалуйста. надеюсь, что у вас есть идея.

Редактировать

вам не нужно getURL функцию больше, я думал, что getCountries оленья кожа возвращает hashMap для URL. , так что все, что вам нужно сделать, это создать невидимый textView в вашем lv_layout и поместить в него каждый URL.

следуйте 4 шагам выше.

для шага 3 в пост:

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

    mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
       long arg3) { 
      // TODO Auto-generated method stub 
          String URL = ((TextView) view.findViewById(R.id.tv_URL)).getText().toString();//this will take the value of the invincible textView 
        Intent i = new Intent(MainActivity.this, WebView.class); 
        i.putExtra("URL", URL); 
        startActivity(i); 
        }  

Редактировать

для webViewActivity вам необходимо получить дополнительные от предыдущей деятельности, как:

public class WebViewActivity extends Activity{ 
private WebView webView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.web_view); 

    webView = (WebView) findViewById(R.id.webview); 
    webView.setWebViewClient(new MyWebViewClient()); 


    String url = getIntent().getExtras().getString("URL") 

    if (null != url) { 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.loadUrl(url); 
    } 
} 

private class MyWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 

}

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