为什么我的ListView没有显示任何内容?

时间:2010-12-25 17:14:35

标签: android listview

我在android中有一个非常基本的ListView,并设置了一个非常基本的适配器。我的问题是列表视图没有显示任何内容,无论适配器和notifyDataSetChanged();

这是我的代码: XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <TextView android:text="@string/app_name"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  ></TextView>
  <ListView android:id="@+id/selectView"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    </ListView>
</RelativeLayout>

活动代码:

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import com.androidcourse.phonemapper.R;
import com.androidcourse.phonemapper.model.SelectViewAdapter;

public class SelectActivity extends Activity {

    private ListView mListView;

    private SelectViewAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.select_activity);
        initializeListView();

    }

    private void initializeListView() {
        mListView = (ListView) findViewById(R.id.selectView);
        mAdapter = new SelectViewAdapter(this);
        mListView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
    }

    @Override
    public void onResume() {
        super.onResume();
    }
}

适配器代码:

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SelectViewAdapter extends BaseAdapter {

    private Context mContext;
    private TextView mMockTextView;

    public SelectViewAdapter(Context cnt) {
        mContext = cnt;
        mMockTextView = new TextView(mContext);
        mMockTextView.setText("Test text");
        mMockTextView.setBackgroundColor(Color.CYAN);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public Object getItem(int position) {
        return mMockTextView;
    }

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

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

}

问题是屏幕上没有显示任何内容。我得到的是黑屏(以及XML中的第一个文本视图)。我看不到mockTextView及其文本。显然我做的事情非常错误,但我无法弄清楚是什么。

5 个答案:

答案 0 :(得分:18)

我能想到的一些事情。

首先,您的RelativeLayout没有相对定位信息。我假设你打算把它放在一个LinearLayout中,其方向设置为你所描述的垂直方向。我的猜测是列表实际上并没有被绘制,因为它甚至没有锚定到当前RelativeLayout中的任何内容。如果坚持使用RelativeLayout,请确保在app_name TextView上放置一个id,并通过layout_below将ListView置于其下。

LinearLayout解决方案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <TextView android:text="@string/app_name"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  ></TextView>
  <ListView android:id="@+id/selectView"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    </ListView>
</LinearLayout>

RelativeLayout解决方案:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <TextView
  android:id="@+id/app_name_text" 
  android:text="@string/app_name"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentTop="true"
  ></TextView>
  <ListView android:id="@+id/selectView"
    android:layout_below="@id/app_name_text"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    </ListView>
</RelativeLayout>

接下来,getView()为所有3个索引返回相同的textView。在多个索引上显示相同的视图并不是一个问题,但是列表大小为3,我打赌屏幕可以同时显示所有三个。而且由于View一次不能在多个位置,我实际上会期望这会失败,所以我怀疑它甚至还没有达到这个代码。尝试为每个getView()创建一个新的TextView。你的MockTextView也没有它自己的布局参数。因此,在listView单元格中放置它可能也不会发生。所以你可以给它类型为AbsListView.LayoutParams(WRAP_CONTENT,WRAP_CONTENT)的参数。再说一次虽然如果它得到了原始代码,我希望这会出错。

getView()整理:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       if(convertView == null) {
          TextView textView = new TextView(parent.getContext());
          textView.setText("Position is:"+position);
          textView.setBackgroundColor(Color.CYAN);
          textView.setLayoutParams(new AbsListView.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
          convertView = textView;
        }
        return mMockTextView;
    }

最后,列表的wrap_content高度有时可能会有问题。我不知道所有场景。如果您最终更改为LinearLayout,请尝试将列表视图的layout_height设置为0,然后设置layout_weight = 1。这会迫使线性布局将其膨胀到更大的空间。

LinearLayout体重解决方案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <TextView android:text="@string/app_name"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  ></TextView>
  <ListView android:id="@+id/selectView"
    android:layout_weight="1"
    android:layout_height="0dp"
    android:layout_width="wrap_content">
    </ListView>
</LinearLayout>

答案 1 :(得分:6)

我正在使用Ed Burnette的书 Hello Android 中的数据绑定示例(好书)。

我将项目布局从A RelativeLayout更改为LinearLayout;但是,当我做出改变时,我没有添加方向。

一旦我添加 android:orientation =“vertical”一切正常。

我生命中的两个小时。

答案 2 :(得分:4)

虽然它没有回答这个问题,但一个典型的问题是将基于父LinearLayout(高度= wrap_content)和每个LinearLayout元素(height = fill_parent)的布局充当适配器资源。

喜欢

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
    android:id="@+id/someText"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="1"/>

虽然它在Eclipse中很好地显示,但每行以height = 0结尾。这可以通过为其中一个子元素

设置height = wrap_content来解决
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
    android:id="@+id/someText"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"/>

答案 3 :(得分:1)

对某人可能会有帮助。

确保实现了适配器函数getCount()并返回大于0的值。如果方法返回0,则不显示或不填充列表。

答案 4 :(得分:0)

我遇到了同样的问题,但是当我更改

ConstraintLayout

进入

Relative layout

它变得可见并解决了问题。