Java 在ListView中使用XML布局扩展自定义视图

Java 在ListView中使用XML布局扩展自定义视图,java,android,listview,canvas,Java,Android,Listview,Canvas,我正在尝试在ListView中创建一个元素,其中显示一些TextView和一个自定义视图,我计划在其中通过覆盖onDraw()绘制到画布。我尝试的方法仅适用于TextView,但在尝试使用自定义元素(Graph)时失败,因此问题肯定出在这里 我有以下XML文件,用作每个ListView项的布局: year_row.xml: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://sc

我正在尝试在ListView中创建一个元素,其中显示一些TextView和一个自定义视图,我计划在其中通过覆盖onDraw()绘制到画布。我尝试的方法仅适用于TextView,但在尝试使用自定义元素(Graph)时失败,因此问题肯定出在这里

我有以下XML文件,用作每个ListView项的布局:

year_row.xml:

<?xml version="1.0" encoding="UTF-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/year_row_linear"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="6dp"
    >
    <TextView android:id="@+id/year_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textColor="@android:color/white"
        />
    <com.android.gradetracker.Graph android:id="@+id/year_graph"
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        />
    <TextView android:id="@+id/year_average"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        />
    <TextView android:id="@+id/year_progress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />    
</LinearLayout>
设置ListView元素的My main类包含以下代码:

    private ArrayList <HashMap<String,Object>> list = new ArrayList <HashMap<String,Object>>();
    private SimpleAdapter adapter;
    private ListView listView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        listView = (ListView) findViewById(R.id.listview);
        listView.setClickable(true);

        String[] from = {"name", "graph", "average", "progress"};
        int[] to = new int[] {R.id.year_name, R.id.year_graph, R.id.year_average, R.id.year_progress};

        adapter = new SimpleAdapter(this.getApplicationContext(), list, R.layout.year_row, from, to);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }

    public void addYear(String name) {
        Graph graph = new Graph(this);
        HashMap<String,Object> map = new HashMap<String,Object>();
        map.put("name", name);
        map.put("graph", graph);
        map.put("average", "--%");
        map.put("progress", "--/--%");
        list.add(map);
        adapter.notifyDataSetChanged();
    }
感谢您事先提供的帮助。

先打电话给super

更改
Graph类的
onDraw
函数

@Override
protected void onDraw(Canvas canvas) {
    //start with super
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);
}

图形
类中需要一个构造函数。

好的,主要问题似乎是SimpleAdaptor不允许使用自定义视图。为了显示自定义视图,我必须创建一个扩展BaseAdapter的自定义适配器,getView()方法的代码如下:

@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=mInflater.充气(R.layout.year_行,父项,false);
}
TextView name=(TextView)convertView.findViewById(R.id.year\u name);
Graph Graph=(Graph)convertView.findViewById(R.id.year\u Graph);
TextView average=(TextView)convertView.findViewById(R.id.year\U average);
TextView进度=(TextView)convertView.findViewById(R.id.year\u进度);
ArrayList行=list.get(位置);
name.setText(String.valueOf(row.get(0));
graph=(graph)row.get(1);
average.setText(String.valueOf(row.get(2));
progress.setText(String.valueOf(row.get(3));
返回视图;
}

谢谢你的回答。我刚刚尝试过这个,但它还是像以前一样崩溃了,使用相同的logcat输出。我尝试添加额外的构造函数:公共图(上下文上下文,属性集属性)和公共图(上下文,属性集属性,int-defStyle)。这将错误更改为:08-04 17:14:15.065:error/AndroidRuntime(429):java.lang.IllegalStateException:com.android.gradetracker.Graph不是一个可以被这个SimpleAdapter绑定的视图,所以我想我现在需要编写一个自定义适配器来执行此操作?在构造函数中,需要行
super(上下文)
(或
super(context,attrs);
)和
getHolder().addCallback(this)mInflater来自哪里?LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);为我工作。
    08-04 17:09:50.415: ERROR/AndroidRuntime(397): android.view.InflateException: Binary XML file line #16: Error inflating class com.android.gradetracker.Graph
@Override
protected void onDraw(Canvas canvas) {
    //start with super
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
    convertView = mInflater.inflate(R.layout.year_row, parent, false);
}

TextView name = (TextView) convertView.findViewById(R.id.year_name);
Graph graph = (Graph) convertView.findViewById(R.id.year_graph);
TextView average = (TextView) convertView.findViewById(R.id.year_average);
TextView progress = (TextView) convertView.findViewById(R.id.year_progress);

    ArrayList<Object> row = list.get(position);

    name.setText(String.valueOf(row.get(0)));
    graph = (Graph)row.get(1);
    average.setText(String.valueOf(row.get(2)));
    progress.setText(String.valueOf(row.get(3)));

    return convertView;
}