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

标签 android listview

我在 android 中有一个非常基本的 ListView,并设置了一个非常基本的适配器。我的问题是 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>

Activity 代码:

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 的第一个 TextView )。我看不到 mockTextView 及其文本。显然我做错了什么,但我不知道是什么。

最佳答案

我能想到的一些事情。

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

线性布局解决方案

<?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。在多个索引上显示相同的 View 不是问题,但是列表大小为三个,我敢打赌屏幕可以同时显示所有三个。由于 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,请尝试将 ListView 的 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>

关于android - 为什么我的 ListView 没有显示任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530940/

相关文章:

android - 与 Android 中的 AsyncTask 通信?

java - 使用 sax 解析器和 imageloader 类将图像解析为 listview

android - 调试 SimpleCursorAdapter

javascript - React native——动态添加onPress View

android - 使用适用于 Android 的 google places api 网络服务搜索附近的特定地点

java - 无法获取另一个类中的屏幕宽度和高度值

java - 如何从InputStream中获取Base64字符串?

安卓包结构

java - ListView 重复第一行 (Android)

java - Android:通过单击按钮将一个 Activity 中的 TextView 添加到另一个 Activity 中的 ListView