2011-09-09 20 views
0

您好,我的问题很简单:imageviews不固定。我在这个链接中看到了一个答案:link,我明白答案,但我做不到。所以我的问题是:我如何关闭在我的适配器视图回收?ImageView继续在我的列表视图中移动因为asynctask

如果你想我可以把代码一点点:

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

}

+0

回收的,便会让OOM错误 – ingsaurabh

+0

所以,我能做些什么呢? – Tsunaze

+0

显示一个虚拟的图像,而所需的图像不下载,因为丹尼尔建议 – ingsaurabh

回答

0

的基本思想是,当你设置你的观点,你要添加的缩略图作为占位符。然后使用Tag属性用类似数据库中ID的标记来“标记”视图 - 这可以用来确定哪一行应该获取图像,并且不应该再经历行移动。

请看Fedor对这个问题的回答:link - 它为您提供了一个很好的例子。

+0

好吧,但他的图像来自SD卡,所以图像下载是完全不同的。 – Tsunaze

+0

嗯,这并不完全不同 - 他仍然下载图像并将它们存储在SD卡上。在我的实施中,我并没有因为我不允许存储图像。 –

+0

所以我需要做的是直接在适配器中传递我的字符串URL列表? – Tsunaze

0

设置背景后,您不需要使图像可绘制无效。删除

image.invalidateDrawable(d); 

onPostExecute()方法行,看看它是否修复。

0

关于Class ImageView的invalidateDrawable方法是什么?

我已经找到源核心波纹管:

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