gpt4 book ai didi

java - 在 ListView 元素内绘制到 Canvas

转载 作者:行者123 更新时间:2023-11-29 06:15:06 25 4
gpt4 key购买 nike

我试图在 ListView 的每个元素内绘制到 Canvas。目前我正在使用以下代码,它会在我启动 Activity 后立即强制关闭:

主.java

public class Main extends Activity
{
private ListView listView;
private List<Row> listRows;

public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.year);

//Added initialisation from answers
listRows = new ArrayList<Row>();

//Add some generic rows to the list for test purposes
for (int i=0; i<4; i++) {
listRows.add(new Row(this));
}

listView = (ListView)findViewById(R.id.ListView1);
listView.setAdapter(new RowAdapter(this, listRows));
}
}


行适配器.java

public class RowAdapter extends BaseAdapter
{
private List<Row> elements;
private Context context;

public RowAdapter(Context c, List<Row> rows) {
this.elements = rows;
this.context = c;
}

@Override
public int getCount() {
return elements.size();
}

@Override
public Object getItem(int position) {
return elements.get(position);
}

@Override
public long getItemId(int id) {
return id;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
return elements.get(position);
}
}


行.java

public class Row extends View 
{
public Row(Context context) {
super(context);
}

@Override
public void onDraw(Canvas canvas) {
//Draw simple string as an example
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawText("Text here...", 0, 0, paint);
}
}

我意识到我的方法可能存在很多问题,所以如果有人能指出正确的方向,我将不胜感激。

提前感谢您的帮助。


编辑: ListView 现在加载但不显示任何元素。我正在使用如下所示的 main.xml 文件。

主.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/ListView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>

最佳答案

你需要listRows = new ArrayList<Row>();在向列表中添加元素之前初始化列表。

通常,尝试在 Eclipse 调试透视图或 ddms 中检查 logcat 的输出。在这种情况下,它会说出“onCreate 中的空指针”的效果,您会节省一些时间。

编辑 我怀疑这是因为您的行 View 不知道它们应该有多大。您可以尝试覆盖 onMeasure用一个简单的方法作为健全性检查:

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(100, 100);
}

可以通过更好地分解代码来减轻这样做的需要。适配器的底层数据并不意味着直接接触 View ;通常, View 是在 getView 中创建的.

例如,您可能有 res/layout/row.xml :

<?xml version="1.0" encoding="utf-8"?>
<com.example.HelloCanvas
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
... other attributes like background color ...
/>

通过这种方式,您可以在自定义 View 上设置 xml 属性,如果您在多个地方使用它,这会很好。

然后 HelloCanvas 将定义 HelloCanvas(Context, AttributeSet)布局充气器使用的构造函数:

public HelloCanvas(Context context, AttributeSet attrs) {
super(context, attrs);
}

最后是你的 getView方法会膨胀 row.xml :

@Override
public View getView(int position, View convertView, ViewGroup parent) {
HelloCanvas hello = (HelloCanvas) convertView;
if (hello == null) {
// inflate a new view
hello = (HelloCanvas)
LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false);
}
hello.setHelloString(getItem(position));
return hello;
}

这样您就不会生成新的 View ,如果您不需要的话,并且您的 ArrayAdapter 的基础数据类型(消除了一些多余的代码)可以是 String。

关于java - 在 ListView 元素内绘制到 Canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com