这是我的代码:
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>