我有一个列表视图,其中包含不同行的不同行。
layout1.xml
<LinearLayout
android:height="wrap_content"
android:width="fill_parent">
<TextView
android:height="wrap_content"
android:width="wrap_content"
android:text="One"
android="@+id/one"/>
</LinearLayout>
layout2.xml
<LinearLayout
android:height="wrap_content"
android:width="fill_parent">
<TextView
android:height="wrap_content"
android:width="wrap_content"
android:text="One"
android="@+id/one" />
<TextView
android:height="wrap_content"
android:width="wrap_content"
android:text="Two"
android="@+id/one" />
</LinearLayout>
在getView()中由于适配器会回收其所有视图,因此它将如何知道 layout1被回收。如果layout1被回收,convertView不为null, 我试着找到textview2。这会抛出空指针吗?
假设convertView始终被回收,无需夸大视图。所以, layout1被回收,但下面的代码期望layout2为 位置。
,
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
//A method to tell if layout1 or layout2 should be inflated based on the position
boolean inflateOne = inflateLayoutOne(position);
if(convertView == null){
if(inflateOne)
convertView = inflater.inflate(R.layout.layout1, null);
else
convertView = inflater.inflate(R.layout.layout2, null);
}
if(inflateOne){
TextView tv1 = (TextView)convertView.findViewById(R.id.one);
tv1.setText("Hello one");
}
else{
TextView tv1 = (TextView)convertView.findViewById(R.id.one);
tv1.setText("Hello one");
TextView tv2 = (TextView)convertView.findViewById(R.id.two);
tv1.setText("Hello Two");.
return convertView;
}
答案 0 :(得分:0)
要告诉convertView返回哪个布局,您应该只能比较ID。
if (convertView.getId() == R.layout.layout1){
//set data for layout 1
}else if(convertView.getId() == R.layout.layout1){
//set data for layout 1
}
答案 1 :(得分:0)
getViewTypeCount
和getViewItemType
。两者都返回一个int值。 getView将收到一些null convertView等于你在getViewTypeCount
中返回的值。您应该使用getViewItemType
来区分不同的视图
答案 2 :(得分:0)
您的适配器必须覆盖getItemViewType(int position)。来自文档:
返回:表示View类型的整数。应该有两种观点 如果一个可以转换为另一个,则共享相同的类型 getView(int,View,ViewGroup)。注意:整数必须在0范围内 to getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPE也可以 返回。
http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)