0

Hi my problem is simple : imageviews are not fixed. I saw an answer in this link : link and i do understand the answer but i can't do it. So my question is : How do i turn off view recycling in my Adapter ?

If you want i can put a little bit of code :

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

}

Community
  • 1
  • 1
Tsunaze
  • 3,204
  • 7
  • 44
  • 81

3 Answers3

0

The basic idea is that when you setup your view you want to add a thumbnail as a placeholder. Then use the Tag property to "mark" the view with something like the ID from the database - this can then be used to identify which row should be getting the image and you shouldn't suffer from shifting rows anymore.

Take a look at the answer to this question by Fedor: link - it provides you with a very good example.

Community
  • 1
  • 1
Daniel Frear
  • 1,459
  • 14
  • 22
  • Okay, but his images are from the SD card, so the image downloader is completely different. – Tsunaze Sep 09 '11 at 09:22
  • Well it's not all that different - he still downloads the images and stores them on the SD card. In my implementation I didn't as I'm not allowed to store the images. – Daniel Frear Sep 09 '11 at 09:24
  • So what i need to do is to pass my list of string url directly in the adapter? – Tsunaze Sep 09 '11 at 09:39
  • You know what, it's way better than before, and i think if i'm going into this direction it's gonna be fine, thanks. – Tsunaze Sep 09 '11 at 09:45
0

You do not need to invalidate the image drawable after set its background. Remove

image.invalidateDrawable(d);

line from the onPostExecute() method and see if it fixes.

Ron
  • 24,175
  • 8
  • 56
  • 97
0

What's it for the method invalidateDrawable about Class ImageView?

I 've found the source core as bellow:

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