2012-05-25 59 views
0

我正在使用自定義視圖組件來繪製一個餅圖(一個簡單的餅圖)。每個列表項都有一個具有不同值的餅圖。列表視圖shuffles自定義組件視圖

現在,當我在列表視圖中使用它時,餅圖值被混洗,有時不會更新。 我的默認餅圖值爲1. 當我第一次打開我的列表 時,第一項顯示適當的值其餘的列表項只顯示自由值1,無論實際值如何。

當我滾動列表餡餅得到的價值,但洗牌。第一個項目的值爲5,第二個項目的值爲3,第三個項目的值爲其他值。

代碼自定義視圖的:

public class PieRating extends View{ 
    private float Rate; 
    private Paint p; 
    private int startX; 
    private int startY; 
    private int radius; 
    private ArrayList<Integer> colors; 
    private ArrayList<Float> values; 
    Bitmap bitmap; 
    Context mContext; 
    public PieRating(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     Rate=1; 
     mContext = context; 

     p = new Paint(); 
     p.setAntiAlias(true); 

     colors = new ArrayList<Integer>(); 
     values = new ArrayList<Float>(); 

     startX = 0; 
     startY = 0; 
     radius = 20; 

     colors.add(Color.GRAY); 
     colors.add(Color.TRANSPARENT); 

     values.add(Rate); 
     values.add(5 - Rate); 

    } 

    public void setRating(float Rate) { 
     this.Rate = Rate; 
     values.clear(); 
     values.add(Rate); 
     values.add(5 - Rate); 

    } 

    public float getRating(){ 
     return Rate; 


    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     float offset = 0; 
     float sum = 0; 
     for (int a = 0; a < values.size(); a++) { 
      sum += values.get(a); 
     } 

     float angle = (float) (360/sum); 

     RectF rectF = new RectF(); 
     rectF.set(getStartX(), getStartY(), getStartX() + getRadius(), 
       getStartY() + getRadius()); 

     for (int i = 0; i < values.size(); i++) { 

      p.setColor(colors.get(i)); 

      if (i == 0) { 
       canvas.drawArc(rectF, 270, values.get(i) * angle, true, p); 
      } 
      else { 
       canvas.drawArc(rectF, offset, values.get(i) * angle, true, p); 
      } 

      offset += (values.get(i) * angle + 270); 
     } 

     canvas.save(); 

    } 


    public int getStartX() { 
     return startX; 
    } 

    public void setStartX(int startX) { 
     this.startX = startX; 
    } 

    public int getStartY() { 
     return startY; 
    } 

    public void setStartY(int startY) { 
     this.startY = startY; 
    } 

    public int getRadius() { 
     return radius; 
    } 

    public void setRadius(int radius) { 
     this.radius = radius; 
    } 

    public ArrayList<Integer> getColors() { 
     return colors; 
    } 

    public void setColors(ArrayList<Integer> colors) { 
     this.colors = colors; 
    } 

    public ArrayList<Float> getValues() { 
     return values; 
    } 

    public void setValues(ArrayList<Float> values) { 
     this.values = values; 
    } 
} 

而我的列表

public View getView(int position, View convertView, ViewGroup parent) { 


PieRating pr =((PieRating)findViewById(R.id.score_pie_container)); 
      try 
      { 
      float rating = Float.parseFloat(JSONHelper.getString(mRestaurants, "restaurants.restaurant[].opinion.general", new int[] { position })); 
      pr.setRating(rating); 
      } 
      catch (Exception e) { 
       // TODO: handle exception 
      } 
} 

打過電話pr.invalidate一旦我設定評級,但沒有好。

回答

0

愚蠢的錯誤

((PieRating)convertView.findViewById(R.id.score_pie_container))

我錯過了convertView部分..

以防萬一有人離開答案運行到類似的問題