这是我的代码:
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及其文本.显然我做的事情相当错了,但我不明白什么.
解决方法
首先,您的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,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>