listview具有不同的视图布局

时间:2014-02-05 20:36:01

标签: android listview android-listview

我有一个列表视图,其中包含不同行的不同行。

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>
  

由于适配器会回收其所有视图,因此它将如何知道   layout1被回收。如果layout1被回收,convertView不为null,   我试着找到textview2。这会抛出空指针吗?

     

假设convertView始终被回收,无需夸大视图。所以,   layout1被回收,但下面的代码期望layout2为   位置。

在getView()中

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

  }

3 个答案:

答案 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)

你做错了。如果您想拥有不同类型的行,则必须覆盖getViewTypeCountgetViewItemType。两者都返回一个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)