Android 在CustomAdpter项中绘制线(或任何其他内容)

Android 在CustomAdpter项中绘制线(或任何其他内容),android,android-canvas,draw,custom-adapter,Android,Android Canvas,Draw,Custom Adapter,我的应用程序中有自定义适配器,我需要根据一些数字在每个ListView项目中画一条简单的线 我已经阅读了很多相关的教程,但我仍然不知道如何以正确的方式实现它。我对Android和Java还不熟悉,但除了画画,我似乎对Android的一切都很了解。谁能给我一些建议,让我得到它 编辑: 以下是我现在使用的一些代码: 在单项目布局(row.xml)中,我有ImageView: <ImageView android:id="@+id/chart" android:layout_wi

我的应用程序中有自定义适配器,我需要根据一些数字在每个ListView项目中画一条简单的线

我已经阅读了很多相关的教程,但我仍然不知道如何以正确的方式实现它。我对Android和Java还不熟悉,但除了画画,我似乎对Android的一切都很了解。谁能给我一些建议,让我得到它

编辑:

以下是我现在使用的一些代码:

在单项目布局(row.xml)中,我有ImageView:

<ImageView
    android:id="@+id/chart"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

我遇到的问题是如何将自定义视图放在图像视图(或任何其他容器)中。

您可以在布局中添加一个
视图来绘制线条,并从适配器更改其颜色/宽度

<View
    android:id="@+id/chart"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

和在适配器中

class MyAdapter extends ArrayAdapter<Integer> {
    private Context context;

    MyAdapter(Context context, Integer[] numbers) {
        super(context, R.layout.your_layout, numbers);
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context)
                .inflate(R.layout.your_layout, parent, false);
            holder = new ViewHolder();
            holder.lineView = convertView.findViewById(R.id.chart);
            convertView.setTag(holder);
        }
        else {
            holder = convertView.getTag();
        }

        int number = getItem(position);

        // Calculate width based on your number. Must be in px
        ViewGroup.LayoutParams params = holder.lineView.getLayoutParams();
        params.width = calculatedWidth;

        // Calculate color based on your number
        int color = Color.rgb(r, g, b);
        holder.lineView.setBackroundColor(color);
    }

    private class ViewHolder {
        View lineView;
    }
}
class MyAdapter扩展了ArrayAdapter{
私人语境;
MyAdapter(上下文,整数[]数字){
super(上下文,R.layout.your_布局,数字);
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=LayoutInflater.from(上下文)
.充气(R.layout.your_布局,parent,false);
holder=新的ViewHolder();
holder.lineView=convertView.findViewById(R.id.chart);
convertView.setTag(支架);
}
否则{
holder=convertView.getTag();
}
int number=getItem(位置);
//根据您的数字计算宽度。必须以px为单位
ViewGroup.LayoutParams params=holder.lineView.getLayoutParams();
params.width=计算宽度;
//根据您的数字计算颜色
int color=color.rgb(r,g,b);
holder.lineView.setBackroundColor(颜色);
}
私有类视窗持有者{
视图线条视图;
}
}
您可以试试这个

public class MyImageView extends ImageView{

private Paint mPaint;
private float cx, cy;
private int size; 

public MyImageView(Context context) {
    super(context);
    init();
}

private void init() {
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.BLACK);
  mPaint.setStrokeWidth(20);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawLine(0, 0, size, size, mPaint);

}

@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
    super.onSizeChanged(w, h, oldw, oldh);
    cx = w/2;
    cy = h/2;
    ///calculate the size of the view here. 
    size = Math.min(w, h);
}



  @Override
   protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
      setMeasuredDimension(size, size);
   }

}

你能再多说一些细节吗。数字是如何决定线条的?在每个listview项目之间画线的方式是否根据它是哪个项目而改变?另外,如果您可以发布一些您当前正在做的事情的代码,我可以提供更多帮助。在文章中添加了一些代码。实际上,我有一个带有数组字段的自定义类,所以理想情况下,我想根据这些数字画一条线。但我需要了解如何在视图中绘制(因为我现在不知道)。自定义视图是否总是相同大小,只是线数不同?假设它是基于少数数字(我的类数组属性将是坐标)的尽可能简单的图表。所以每个列表的大小都是一样的,里面有不同的行。我仍然不明白在这种情况下画画是如何工作的,我觉得自己像个白痴。@Vla你似乎想画斜线。这种方法不适用于这种情况。试试开发者保罗的答案。
public class MyImageView extends ImageView{

private Paint mPaint;
private float cx, cy;
private int size; 

public MyImageView(Context context) {
    super(context);
    init();
}

private void init() {
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.BLACK);
  mPaint.setStrokeWidth(20);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawLine(0, 0, size, size, mPaint);

}

@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
    super.onSizeChanged(w, h, oldw, oldh);
    cx = w/2;
    cy = h/2;
    ///calculate the size of the view here. 
    size = Math.min(w, h);
}



  @Override
   protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
      setMeasuredDimension(size, size);
   }

}