Вам необходимо listRows = new ArrayList<Row>();
инициализировать список перед добавлением в него элементов.
В общем, попробуйте проверить вывод logcat в вашей перспективе отладки Eclipse или в ddms.В этом случае он сказал бы что-то вроде «нулевого указателя в onCreate», и вы бы сэкономили себе время.
Редактировать Я подозреваю, что это потому, что ваши Row просмотрыне знаю, насколько они должны быть большими.Вы можете попробовать переопределить onMeasure
с помощью простого метода проверки работоспособности:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(100, 100);
}
Необходимость сделать это может быть уменьшена за счет лучшего факторинга вашего кода.Базовые данные адаптера не предназначены для непосредственного контакта с представлениями;как правило, представления создаются в 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 ...
/>
Таким образом, вы можете установить свойства 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;
}
Таким образом, вы не генерируете новые представления, если вам это не нужно, а базовый тип данных вашего ArrayAdapter (устраняет часть лишнего кода) может быть String.