Domanda

Ho ricevuto tutti i dati ... ma non sono in grado di utilizzare WebView URL (URLWeb), intendo quando clicco sulla voce Elenco, quindi si aprirà in Web View. Quando faccio clic su qualsiasi elenco dovrebbe passare l'URL corrispondente all'Attività WebView . Come ottenere questo, come conservare l'URL corrispondente ??Per favore qualcuno mi aiuti ..

La mia Mainalty:

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

}

My 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;
}
.

}

Grazie in anticipo ..

È stato utile?

Soluzione

Io uso questo trucco quando voglio passare i dati da listview a un'altra attività.

1- Io aggiungo un textView al mio item-list.xml che è R.layout.lv_layout nel tuo caso e renderà la sua visibilità è andata. android:visibility="gone"

2- Aggiungere la stringa URL a questo textView, non verrà visualizzato nel ListView, perché non ha visibilità.

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- Nella funzione OnItemClick aggiungere solo quanto segue:

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- Utilizzare GetIntent nella tua attività WebView per ottenere l'URL e caricarlo.

Se è ancora vago per favore informami. Spero tu abbia avuto l'idea.

Modifica

Non hai più bisogno della funzione getURL, ho pensato che getCountries non restituisca un hashMap per URL. Quindi tutto ciò che devi fare è creare una messa a punto invisibile nel tuo lv_layout e inserire ciascun URL in esso.

Seguire i 4 passaggi sopra.

per il passaggio 3 in post:

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

Modifica

Per WebViedity è necessario ottenere un extra dall'attività precedente come quanto segue:

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

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top