Раздуть вид выделить НОВЫЙ ОБЪЕКТ?

1

Я немного запутался в этом фрагменте кода:

  for(int i = 0; i < poi.getCommenti().size();i++){
            item = poi.getCommenti().get(i);
            commento = li.inflate(R.layout.commento, null); 
            commento_data = (TextView) commento.findViewById(R.id.commento_data);
            commento_descrizione =(TextView)  commento.findViewById(R.id.commento_descrizione);
            commento_name = (TextView) commento.findViewById(R.id.commento_nome);
            commento_foto = (ImageView) commento.findViewById(R.id.commento_foto);
            Log.d(TAG, "commento_foto:"+commento_foto);
            commento_data.setText(item.getData());
            commento_descrizione.setText(item.getTesto());
            commento_name.setText(item.getUtente().getName());
            contenitore_commenti.addView(commento);
               image[i] = new ImageViewURL(commento_foto, item.getAnteprimaURL());  
        }

        // I start only one thread for all images
        thread_image_commenti = new ImageThreadURL(this);
        thread_image_commenti.execute(image);

thread image - простой поток, который выполняет загрузку изображения и принимает 2 param:

1) ImageView, где thread call setImage (Bitmap)

2) Строка, представляющая URL-адрес (для загрузки изображения)

Проблема в том, что я вижу, что все мои фотографии мерцают, когда загружается одно изображение, и все фотографии имеют одинаковое изображение (URL-адреса не совпадают).

Это правильный путь? Надуть новое представление для каждого элемента, создающего NEW VIEW OBJECT для каждой итерации, или они являются одним и тем же объектом?

Что не так?

Большое спасибо заранее.

pedr0

Это код моего потока:

public class ImageThreadURL extends AsyncTask<SingleImageURL, SingleImageURL,Void>{

    public final static String TAG = "ImageThreadURL";
    static final int MAX_CONN = 25;
    static final int TIMEOUT_DATA = 0;
    static final int TIMEOUT_CONNECTION = 10000;

    Activity caller;
    Animation animation;


    public ImageThreadURL(Activity caller) {
        super();
        this.caller = caller;
        this.animation  = AnimationUtils.loadAnimation(caller, R.anim.alphaanimation);
        animation.setRepeatCount(0);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        caller.setProgressBarIndeterminateVisibility(true);
    }

    @Override
    protected Void doInBackground(SingleImageURL... arg0) {
        Log.d(TAG, "Lunghezza array input:"+arg0.length);
        HttpParams parameters = new BasicHttpParams();
        HttpProtocolParams.setVersion(parameters, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(parameters, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(parameters, false); // some webservers have problems if this is set to true
        ConnManagerParams.setMaxTotalConnections(parameters, MAX_CONN);
        HttpConnectionParams.setConnectionTimeout(parameters, TIMEOUT_CONNECTION);
        HttpConnectionParams.setSoTimeout(parameters,TIMEOUT_DATA);
        SchemeRegistry schReg = new SchemeRegistry();
        schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
        DefaultHttpClient client_http = new DefaultHttpClient(conMgr, parameters);
        HttpGet method;
        HttpResponse response;
        HttpEntity entity;
        InputStream in ;
        Bitmap image ;

        SingleImageURL actual=null;

        try{
            for(int i = 0; i < arg0.length ;i++){   
                actual = arg0[i];
                Log.d(TAG,"Preparo download:"+ actual.getUrl());
                if(actual.getUrl() == null)
                    continue;
                method = new HttpGet(Uri.decode(actual.getUrl()));
                response = client_http.execute(method); 
                entity = response.getEntity();
                BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
                in = bufHttpEntity.getContent(); 
                image = BitmapFactory.decodeStream(in);
                // problema scaricamento immagine
                if(image == null){throw new Exception("BitmapFactory.decodeStream() return null!");}
                else{       
                    Log.d(TAG,"Eseguito Download:"+ actual.getUrl());
                    actual.setImage(image);
                    publishProgress(arg0[i]);
                }
            }

        }catch (Exception e) {e.printStackTrace();}
        return null;
    }

    @Override
    protected void onProgressUpdate(SingleImageURL... values) {
        Log.d(TAG, "onProgressUpdate");
        values[0].getView().startAnimation(animation);
        values[0].setImage();
    }


    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        caller.setProgressBarIndeterminateVisibility(false);
    }



}
Теги:
view

1 ответ

0
Лучший ответ

Вы также должны опубликовать код темы. В Android вы не можете изменять объекты интерфейса (ImageView) из другого потока, кроме потока пользовательского интерфейса. Это может быть то, что происходит.

Если у вас несколько видов, вам следует рассмотреть возможность использования виджета ListView вместе с пользовательским адаптером (для раздувания макета для каждой строки).


Edit:

  • Вы пытались избавиться от анимации в первый раз, чтобы увидеть, остается ли проблема?

  • Я также заметил, что вы создаете два объекта ImageViewURL.

        image[i] = new ImageViewURL(commento_foto, item.getAnteprimaURL());
        thread_image_commenti = new ImageThreadURL(this);
        thread_image_commenti.execute(new ImageViewURL(commento_foto, item.getAnteprimaURL()));
    

Не должно быть:

        image[i] = new ImageViewURL(commento_foto, item.getAnteprimaURL());
        new ImageThreadURL(this).execute(image[i]);

?

  • 0
    Слишком долго, я думаю, я делаю код setImage в onProgressUpdate (), который выполняется в потоке пользовательского интерфейса.
  • 0
    Также смотрите мой отредактированный ответ
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню