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

Geo*_*rge 14 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>
Run Code Online (Sandbox Code Playgroud)

活动代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

和适配器代码:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*lli 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

接下来,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;
    }
Run Code Online (Sandbox Code Playgroud)

最后,列表的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>
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

一旦我添加了android:orientation ="vertical"一切正常.

我生命中的两个小时.