我在 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/