Как обновить изображение каждого ImageView ListView в Android с новым изображением для каждого

Сначала я выбираю тексты и добавляю их в ListView (эта часть работает).
Затем для каждого элемента в ListView я получаю изображение и должен добавить это изображение в ImageView каждого элемента, который уже определен в макете.
Я могу получить все изображения, но не знаю, как обновить ListView с тем же.

//AsyncTask For texts.
private class pgData extends AsyncTask<String, String, JSONArray> {
    protected JSONArray doInBackground(String... params) {
        publishProgress("Starting");
        String result=null;
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://xxx.xxx/xxx.php");
        HttpResponse response = null;
        HttpEntity httpentity =null;
        JSONArray t=null;
        try{
            response= httpclient.execute(httppost);
            httpentity=response.getEntity();
            result= EntityUtils.toString(httpentity);
            t=new JSONArray(result);
        }catch (Exception e){
            publishProgress(e.toString());
            this.cancel(true);
        }
        return  t;
    }
    protected void onProgressUpdate(String... i) {
        Toast.makeText(getBaseContext(), i[0], Toast.LENGTH_SHORT).show();
    }

    protected void onPostExecute(JSONArray result) {
            String x[];
            l = result.length();
            pg_data = new pg[l];
            JSONObject jsonObject;
            for (int i = 0; i < l; i++) {
                try {
                    jsonObject = result.getJSONObject(i);
                    x[0] = jsonObject.getString("xxx");
                    x[1]=jsonObject.getString("xxx");
                    x[2] = jsonObject.getString("xxxx");
                    x[3] = jsonObject.getString("rentMonthly");
                    pg_data[i] = new pg(
                            x[0],
                            x[1],
                            x[2],
                            x[3]
                    );
                    jdata.add(xxx_data[i]);
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
                }
            }
            adapter = new pgAdapter(second.this,
                    R.layout.pg,
                    xxx_data);
            lv = (ListView) findViewById(R.id.listView);
            lv.setAdapter(adapter);
            new xxImage().execute(); //exexuting async task for fetching images.
    }
}

//Async Task for fetching images
private class xxImage extends AsyncTask<String, String, JSONArray> {
    protected JSONArray doInBackground(String... params) {
        publishProgress("Getting Images");
        String result=null;
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://xxx.xx/xx.php");
        HttpResponse response = null;
        HttpEntity httpentity =null;
        JSONArray t=null;
        try{
            response= httpclient.execute(httppost);
            httpentity=response.getEntity();
            result= EntityUtils.toString(httpentity);
            t=new JSONArray(result);
        }catch (Exception e){
            publishProgress(e.toString());
            this.cancel(true);
        }
        return  t;
    }
    protected void onProgressUpdate(String... i) {
        Toast.makeText(getBaseContext(), i[0], Toast.LENGTH_SHORT).show();
    }
    protected void onPostExecute(JSONArray result) {
            String image1;
            l = result.length();
            xx_image = new xxImage[l];
            JSONObject jsonObject;
            for (int i = 0; i < l; i++) {
                try {
                    jsonObject = result.getJSONObject(i);
                    image1 = "n" + jsonObject.getString("image1") + "n";
                    xx_image[i] = new xxImage(
                            image1
                    );
                    jimage.add(xx_image[i]);
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
                }
            }
            //I got all the Images in 'jimage'. Now how to update the ListView from here?
        }
    }

2 ответа

  1. Для этого необходимо реализовать пользовательский ArrayAdapter. В первом asyncTask вы устанавливаете адаптер, используя текстовые данные, которые у вас есть, но адаптер, который вы используете, имеет форму

    ArrayAdapter(Context context, int resource, T[] objects)
    

    В вашем случае T-строка (насколько я могу видеть). Но вы хотите, чтобы этот T был пользовательским объектом, который также включает изображение. Вы можете сделать это, создав свой собственный адаптер. Взгляните на этот ответ.

    Или другой способ заключается в том, что ваш объект T должен быть чем-то вроде этого.

    CustomObject customObject = new CustomObject(text, image). 
    

    Попробуйте создать список этих объектов, который вы затем передадите адаптеру вместо передачи только текстового массива. Но для этого вам придется подождать, пока все изображения будут загружены.

    Лучше использовать Пикассо . И внедрить пользовательский адаптер. Ваш нынешний подход очень ошибочен.

  2. Во втором AsyncTask выполните следующие действия в цикле:

    1. проанализируйте изображение после его получения в image1.
    2. получить элемент в i от адаптера.
    3. от этого элемента найдите представление с его идентификатором.
    4. установите изображение на нем.

    Выполнено. Попробуйте, надеюсь, что это работает для вас.