Android ListView不与自定义适配器类一起显示

Android ListView不与自定义适配器类一起显示,android,listview,android-listview,android-arrayadapter,Android,Listview,Android Listview,Android Arrayadapter,我有一个Apple类,有两个字段,颜色和旋转,还有一个AppleView视图,它在onDraw方法中以该颜色和旋转绘制苹果。这是我实际代码的简化。AppleView有一个默认的苹果,比如说,红色,旋转0度,可以重新分配。下面是两个类的一些伪代码: public class Apple { int colour; int rotation; } public class AppleView extends View { Apple apple = getDefaultAp

我有一个Apple类,有两个字段,颜色和旋转,还有一个AppleView视图,它在onDraw方法中以该颜色和旋转绘制苹果。这是我实际代码的简化。AppleView有一个默认的苹果,比如说,红色,旋转0度,可以重新分配。下面是两个类的一些伪代码:

public class Apple {
    int colour;
    int rotation;
}

public class AppleView extends View {
    Apple apple = getDefaultApple();

    @Override
    protected void onDraw(Canvas canvas) {
        drawApple(canvas, apple);
    }
}
我想从苹果的ArrayList中创建苹果新闻的列表视图。我创建了两个布局:ListView R.layout.list\u视图:

最后,我扩展了ListActivity并使用自定义适配器类来绘制列表项:

public class MyListActivity extends ListActivity {

    ArrayList<Apple> apples = new ArrayList<Apple>();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view);

        // Add 100 random apples to the list for demonstration.
        for (int i = 0; i < 100; i++) {
            apples.add(getRandomApple());
        }

        getListView().setAdapter(new MyAdapter(this, R.layout.list_item, apples));
    }

    class MyAdapter extends ArrayAdapter<Apple> {
        public MyAdapter(Context context, int resourceID, ArrayList<Apple> items) {
            super(context, resourceID, items);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
            }

            // Change this AppleView's apple to the new ArrayList element at this position.
            AppleView appleView = (AppleView) convertView.findViewById(R.id.apple);
            appleView.apple = apples.get(position);

            return convertView;
        }
    }
}
尽管为每个苹果调用了所有正确的方法,即getView和onDraw,但ListView不显示:


上面代码中的错误在哪里

未定义与父元素匹配的ListView元素集的高度,即它为0,因为高度由内容的大小决定。要解决此问题,请为图元指定固定高度,例如:

<?xml version="1.0" encoding="utf-8"?>
<com.mypackage.AppleView xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="100dp" /* THIS LINE CHANGED */
      android:id="@+id/apple">
</com.mypackage.AppleView>

我猜:你的drawApple方法有问题。适配器看起来很好。@PhilippJahoda我已经使用drawApple方法来绘制单个苹果,因此该方法本身绝对不是问题所在。请将apple视图的layout_宽度和layout_高度设置为固定值,例如100dp,以便进行测试。在这种情况下,“匹配父对象”并没有真正意义。发布自定义视图的构造函数。我还尝试在listview上设置背景色,例如绿色,为苹果设置背景色,例如红色,以查看它们是否真的在屏幕上绘制。
public class MyListActivity extends ListActivity {

    ArrayList<Apple> apples = new ArrayList<Apple>();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view);

        // Add 100 random apples to the list for demonstration.
        for (int i = 0; i < 100; i++) {
            apples.add(getRandomApple());
        }

        getListView().setAdapter(new MyAdapter(this, R.layout.list_item, apples));
    }

    class MyAdapter extends ArrayAdapter<Apple> {
        public MyAdapter(Context context, int resourceID, ArrayList<Apple> items) {
            super(context, resourceID, items);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
            }

            // Change this AppleView's apple to the new ArrayList element at this position.
            AppleView appleView = (AppleView) convertView.findViewById(R.id.apple);
            appleView.apple = apples.get(position);

            return convertView;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<com.mypackage.AppleView xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="100dp" /* THIS LINE CHANGED */
      android:id="@+id/apple">
</com.mypackage.AppleView>
I have made some change with your arrayadapter.
 class MyAdapter extends ArrayAdapter<ArrayList<Apple>> {
        private ArrayList<Apple> apple = null;
        public MyAdapter(Context context, int resourceID, ArrayList<Apple> items) {
            super(context, resourceID, items);
            this.apple = items;
        }


  @Override
        public int getCount() {
    //Check with this size if it is greater than zero,then list is visible
            return apple.size();
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
            }

            // Change this AppleView's apple to the new ArrayList element at this position.
            AppleView appleView = (AppleView) convertView.findViewById(R.id.apple);
            appleView.apple = apple.get(position);

            return convertView;
        }
    }