ImageView продолжает смещаться в моем списке просмотра из-за асинхронной задачи - PullRequest
0 голосов
/ 09 сентября 2011

Привет, моя проблема проста: изображения не исправлены.Я видел ответ в этой ссылке: ссылка , и я понимаю ответ, но не могу этого сделать.Итак, мой вопрос: как мне отключить повторное использование представления в моем адаптере?

Если хотите, я могу добавить немного кода:

public class PortfolioAdapter extends ArrayAdapter<PortfolioView>{
private ArrayList<PortfolioView> items;
public PortfolioAdapter(Context context, int textViewResourceId, ArrayList<PortfolioView> items) {
    super(context, textViewResourceId, items);
    this.items = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.portfolio_rows, null);
    }
    PortfolioView pv = items.get(position);
    if (pv != null) {
            TextView ticker = (TextView) v.findViewById(R.id.portfolio_rows_ticker);
            TextView location = (TextView)v.findViewById(R.id.portfolio_rows_location);
            TextView country = (TextView)v.findViewById(R.id.portfolio_rows_country);
            TextView portfolio_value = (TextView)v.findViewById(R.id.portfolio_rows_portfolio_value);
            TextView yesterday_earnings = (TextView)v.findViewById(R.id.portfolio_rows_yesterday_earnings);
            TextView shares = (TextView)v.findViewById(R.id.portfolio_rows_shares);
            TextView last_buy_shares = (TextView)v.findViewById(R.id.portfolio_rows_last_buy_shares);
            TextView last_buy = (TextView)v.findViewById(R.id.portfolio_rows_last_buy);
            TextView your_shares_held = (TextView)v.findViewById(R.id.portfolio_rows_your_shares_held);
            ImageView SmPortrait = (ImageView)v.findViewById(R.id.portfolio_rows_sm_portrait);
            if (ticker != null) {
                  ticker.setText(pv.getPortfolio_ticker()); 
            }
            if (location != null) {
                location.setText(pv.getLocation()); 
            }
            if (country != null) {
                country.setText(pv.getCountry()); 
            }
            if (portfolio_value != null) {
                DecimalFormat f_portfolio_value = new DecimalFormat();
                f_portfolio_value.setMaximumFractionDigits(2);
                String portfolio_value_format = f_portfolio_value.format(pv.getPortfolio_value());

                portfolio_value.setText(portfolio_value_format); 
            }
            if (yesterday_earnings != null) {
                DecimalFormat f_yesterday_earnings = new DecimalFormat();
                f_yesterday_earnings.setMaximumFractionDigits(2);
                String yesterday_earnings_format = f_yesterday_earnings.format(pv.getYesterday_earnings());

                yesterday_earnings.setText(yesterday_earnings_format); 
            }
            if (shares != null) {
                shares.setText(Integer.toString(pv.getShares())); 
            }
            if (last_buy_shares != null) {
                last_buy_shares.setText(Integer.toString(pv.getLast_buy_shares())); 
            }
            if (last_buy != null) {
                last_buy.setText(pv.getLast_buy()); 
            }
            if (your_shares_held != null) {
                your_shares_held.setText(Integer.toString(pv.getYour_shares_held())); 
            }
            if(SmPortrait != null){
                createimage(SmPortrait, pv.getSm_portrait());
            }

    }
    return v;
}
private class CreateImage extends AsyncTask<String, Void, Drawable> {
    ImageView image;
    public CreateImage(ImageView img) {
        image = img;
        image.invalidate();
    }
    protected void onPreExecute() {
    }

    protected Drawable doInBackground(String... urls) {
        InputStream is;
        Drawable d = null ;
        try {
            is = (InputStream)new URL(urls[0]).getContent();
            d = Drawable.createFromStream(is, "Image");
            return d;
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return d;
    }
    protected void onPostExecute(Drawable d) {
        image.setBackgroundDrawable(d);
        image.invalidateDrawable(d);

    }
}
// Catch portrait
public void createimage(ImageView img, String url){
    new CreateImage(img).execute(url);
}

}

Ответы [ 3 ]

0 голосов
/ 09 сентября 2011

Вам не нужно делать недействительным изображение, которое можно нарисовать после установки фона.Удалите строку

image.invalidateDrawable(d);

из метода onPostExecute() и посмотрите, исправляет ли она.

0 голосов
/ 01 апреля 2012

Что это за метод invalidateDrawable для Class ImageView?

Я обнаружил исходное ядро, как показано ниже:

@Override
public void invalidateDrawable(Drawable dr) {
    if (dr == mDrawable) {
        /* we invalidate the whole view in this case because it's very
         * hard to know where the drawable actually is. This is made
         * complicated because of the offsets and transformations that
         * can be applied. In theory we could get the drawable's bounds
         * and run them through the transformation and offsets, but this
         * is probably not worth the effort.
         */
        invalidate();
    } else {
        super.invalidateDrawable(dr);
    }
}
0 голосов
/ 09 сентября 2011

Основная идея заключается в том, что при настройке вида вы хотите добавить эскиз в качестве заполнителя.Затем используйте свойство Tag, чтобы «пометить» представление чем-то вроде идентификатора из базы данных - это можно использовать для определения того, какая строка должна получать изображение, и вы больше не должны страдать от смещения строк.

Посмотрите на ответ Федора на этот вопрос: ссылка - он дает вам очень хороший пример.

...