将自定义视图动态添加到 recyclerview

Add custom view dynamically to a recyclerview

我必须为回收站视图中添加的每个项目创建一个新的自定义视图。

@Override
public ListViewAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    BaseViewHolder viewHolder =new BaseViewHolder(view);
    return viewHolder;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
    if(holder instanceof BaseViewHolder){
    circleAnimationViewClass =new CircleAnimationView(mContext);

    circleAnimationViewClass.addRadius(circleList.get(position).getRadius());
    circleAnimationViewClass.addSpeed(circleList.get(position).getSpeed());
    circleAnimationViewClass.addColor(circleList.get(position).getColor());
    if(getItemViewType(position) >-1){
        circleAnimationViewClass.onStart();
        holder.bindCircle(circleList.get(position));

    }
    }

}
public class BaseViewHolder extends RecyclerView.ViewHolder {

    protected Context mActivityContext;
    View circleAnimationView;
    TextView radiusTextView;
    TextView speedTextView;
    public BaseViewHolder(View itemView) {
        super(itemView);
        this.circleAnimationView = (CircleAnimationView ) itemView.findViewById(R.id.animationView);
        this.radiusTextView = (TextView)itemView.findViewById(R.id.radiusText);
        this.speedTextView=(TextView)itemView.findViewById(R.id.speedText);
        mActivityContext =itemView.getContext();
    }
    public void bindCircle(CircleProperties objCircle){
        circleAnimationViewClass.drawCanvas((CircleProperties)objCircle);
        circleAnimationViewClass.invalidate();
    }
}

这是我的循环动画class

 public void addRadius(int radius){
        circleRadius =radius;
    }
    public void addSpeed(int speed){
        circleSpeed=speed;
    }
    public void addColor(int color){
        circleColor= color;
    }
 public CircleAnimationView(Context context, AttributeSet attributes) 
{
        super(context, attributes);
        TypedArray typedArray = context.obtainStyledAttributes(attributes, R.styleable.CircleAnimationView);
        circleRadius = typedArray.getColor(R.styleable.CircleAnimationView_radius, 20);
        circleSpeed = typedArray.getColor(R.styleable.CircleAnimationView_speed, 100);
        circleColor =typedArray.getColor(R.styleable.CircleAnimationView_circleColor, Color.BLACK);
        typedArray.recycle();
    }


    @Override
    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setStrokeWidth(5);
            paint.setColor(circleColor);
            if (i == 0) {
                startXPos = dpToPx(circleRadius);
                i = dpToPx(circleRadius);
                canvas.drawCircle(startXPos, dpToPx(40), dpToPx(circleRadius), paint);
                //canvas.drawCircle(dpToPx(200), dpToPx(200), dpToPx(30), paint);
            } else {
                startXPos =   startXPos >= (canvas.getWidth() - dpToPx(circleRadius)) ? dpToPx(circleRadius) : startXPos + dpToPx(circleSpeed / 16);

                canvas.drawCircle(startXPos, dpToPx(40), dpToPx(circleRadius), paint);

            }
            i++;
    }

问题是我没有在 onDraw 中获取半径和速度的值。我正在使用 invalidate 来调用自定义视图的 ondraw。主要要求是每次将新项目添加到回收站视图时,我需要为该项目创建自定义视图并对项目进行定制处理。

正确使用 Recycler View 或至少使用 view holder 模式。还有 RecyclerView.Adapter.

public class ListViewAdapter extends RecyclerView.Adapter<BaseViewHolder> {

private List<CircleProperties> properties;

ListViewAdapter(Activity context, List<CircleProperties> circleObjectList){
    mContext = context;
    circleList =circleObjectList;
}

@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType.equals(A_VIEW_TYPE) {
        return new CircleAViewHolder(mActivityContext, mInflater.inflate(CircleViewHolder.CIRCLE_A_VIEW_ID, parent, false));
    } else if(viewType.equals(B_VIEW_TYPE) {
        new CircleAViewHolder(mActivityContext, mInflater.inflate(CircleViewHolder.CIRCLE_B_VIEW_ID, parent, false));
    }       
}

@Override
public int getItemViewType(int position) {
    return properties.get(position).getType();
}

@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
    holder.bind(properties.get(position));
}

@Override
public int getItemCount() {
    return properties.size();
}
}

然后像这样创建视图持有者...

public class BaseViewHolder extends RecyclerView.ViewHolder {

protected Context mActivityContext;
protected int mPosition;

public BaseViewHolder(View itemView) {
    super(itemView);
}

public BaseViewHolder(Context context, View itemView) {
    super(itemView);
    mActivityContext = context;

}

public void bind(Object data){
}
}

以及视图持有者的子类...

private class CircleAViewHolder extends BaseViewHolder{

    CircleAnimationView circleAnimationView;
    TextView radiusTextView;
    TextView speedTextView;

    ViewHolder(Context context, View itemView) {
        this.circleAnimationView = (CircleAnimationView ) itemView.findViewById(R.id.circle_animation_view);
        this.radiusTextView = (TextView)itemView.findViewById(R.id.radius_view);
        this.speedTextView=(TextView)itemView.findViewById(R.id.speed_text_view);
    }

    public void bind(Object data){
        CircleProperties circleProp = (CircleProperties) data;
        radiusTextView.setText(circleProp.getRadius());
        speedTextView.setText(circleProp.getSpeed());
        animaitonView.drawCanvas(data);
        //TODO: Any other view setup using data.
    }
}

还有第二个视图持有者,例如...

private class CircleBViewHolder extends BaseViewHolder{

    CircleAnimationView animationView;
    TextView diameterTextView;
    TextView velocityTextView;

    ViewHolder(Context context, View itemView) {
        this.animationView = (CircleAnimationView) itemView.findViewById(R.id.animation_view);
        this.diameterTextView =(TextView)itemView.findViewById(R.id.diameter_view);
        this.velocityTextView=(TextView)itemView.findViewById(R.id.velocity_text_view);
    }

    public void bind(Object data){
        CircleProperties circleProp = (CircleProperties) data;
        diameterTextView.setText(circleProp.getDiameter());
        velocityTextView.setText(circleProp.getVelocity());
        animaitonView.drawCanvas(data);
        //TODO: Any other view setup using data.
    }
}