Android 列表视图洗牌自定义组件视图
我正在使用自定义视图组件绘制饼图(简单饼图)。每个列表项都有一个具有不同值的饼图 现在,当我在列表视图中使用它时,饼图值会被洗牌,有时不会更新。 我的默认饼图值是1。 当我第一次打开我的列表时 第一项显示正确的值,其余列表项仅显示默认值1,而不考虑实际值 当我滚动列表时,饼图会得到值,但这些值会被洗牌。第一个项目的价值为5,第二个项目的价值为3,第三个项目的价值为其他项目 自定义视图的代码:Android 列表视图洗牌自定义组件视图,android,android-listview,android-custom-view,Android,Android Listview,Android Custom View,我正在使用自定义视图组件绘制饼图(简单饼图)。每个列表项都有一个具有不同值的饼图 现在,当我在列表视图中使用它时,饼图值会被洗牌,有时不会更新。 我的默认饼图值是1。 当我第一次打开我的列表时 第一项显示正确的值,其余列表项仅显示默认值1,而不考虑实际值 当我滚动列表时,饼图会得到值,但这些值会被洗牌。第一个项目的价值为5,第二个项目的价值为3,第三个项目的价值为其他项目 自定义视图的代码: public class PieRating extends View{ private
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;
}
}
我设置了评级后,尝试调用了pr.invalidate
,但没有效果。愚蠢的错误
((PieRating)convertView.findViewById(R.id.score\u pie\u container))
我错过了convertView
部分
留下答案,以防有人遇到类似问题
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
}
}