0

カスタム ビュー コンポーネントを使用して円 (単純な円) を描画しています。各リスト アイテムには、異なる値の円があります。

リストビューで使用すると、パイの値がシャッフルされ、更新されないことがあります。デフォルトの円グラフの値は 1 です。最初にリストを開くと、最初の項目に適切な値が表示されます。残りのリスト項目には、実際の値に関係なくデフォルト値 1 のみが表示されます。

リストをスクロールすると、パイは値を取得しますが、シャッフルされます。最初のアイテムの値は 5th 、2nd の値は 3rd 、3rd の値はそれ以外です。

カスタム ビューのコード:

    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レーティングを設定したら電話をかけてみましたがだめでした。

4

1 に答える 1

0

愚かな間違い

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

私はその部分を逃したconvertView..

誰かが同様の問題に遭遇した場合に備えて回答を残す

于 2012-05-26T18:09:40.243 に答える