2013-09-09 2 views
0

Я пытаюсь заполнить ListView базовым адаптером. Список загружается должным образом в начале, но когда я начинаю прокручивать, я возвращаю null из view.getViewById. Вот мой код:findViewById возвращает null после прокрутки int ListView

активность:

public class LightActivty extends Activity { 
private ListView listView; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.light); 

    listView=(ListView)findViewById(R.id.light_listview); 
    listView.setAdapter(new LightAdapter(this, Model.model.getFloors())); 
} 
@Override 
public void setContentView(View view) { 
    // TODO Auto-generated method stub 
    super.setContentView(view); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.light_acitivty, menu); 
    return true; 
} 
} 

BaseAdapter:

public class LightAdapter extends BaseAdapter { 
List<BaseObject> items; 
Context context; 
LayoutInflater inflater; 

public LightAdapter(Context context, List<Floor> floors) { 
    this.context = context; 
    this.items = initData(floors); 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

private List<BaseObject> initData(List<Floor> floors) { 
    List<BaseObject> lst = new ArrayList<BaseObject>(); 
    for (Floor f : floors) { 
     lst.add(f); 
     for (Room r : f.getRooms()) { 
      lst.add(r); 
      for (Light l : r.getLights()) { 
       lst.add(l); 
      } 
     } 
    } 
    return lst; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Object getItem(int index) { 
    return null; 
} 

@Override 
public long getItemId(int arg0) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = convertView; 
    Log.d("Test", "start:"+position); 
    BaseObject obj = (BaseObject) items.get(position); 
    if (obj.typ == EntityTypes.FLOOR) { 
     Floor f = (Floor) obj; 
     Log.d("Test", "floor"+f+";"); 
     if (convertView == null) 
      view = inflater.inflate(R.layout.light_list_item_floor, null); 
     TextView textView = (TextView) view 
       .findViewById(R.id.light_list_item_floor_label); 
     textView.setText(f.bezeichnung); 
    } else if (obj.typ == EntityTypes.ROOM) { 
     Room r = (Room) obj; 
     //Log.d("Test", "room:"+r+";"+r.bezeichnung); 
     if (convertView == null){ 
      view = inflater.inflate(R.layout.light_list_item_room, null); 
     } 

     TextView textView = (TextView) view 
       .findViewById(R.id.light_list_item_room_label); 
     Log.d("Test", r.bezeichnung+";"+textView+";"+view); 
     textView.setText(r.bezeichnung); 
    } else if (obj.typ == EntityTypes.LIGHT_ONOFF) { 
     LightOnOff l = (LightOnOff) obj; 
     Log.d("Test", "lightOnOFf"+l+";"); 
     if (convertView == null) 
      view = inflater.inflate(R.layout.light_list_item_lightonoff, 
        null); 
     TextView textView = (TextView) view 
       .findViewById(R.id.light_list_item_lightonoff_label); 
     textView.setText(l.bezeichnung); 
    } else if (obj.typ == EntityTypes.LIGHT_DIM) { 
     LightDim l = (LightDim) obj; 
     Log.d("Test", "lightDim"+l+";"); 
     if (convertView == null) 
      view = inflater 
        .inflate(R.layout.light_list_item_lightdim, null); 
     TextView textView = (TextView) view 
       .findViewById(R.id.light_list_item_lightdim_label); 
     textView.setText(l.bezeichnung); 
    } else if (obj.typ == EntityTypes.LIGHT_RGB) { 
     LightRGB l = (LightRGB) obj; 
     Log.d("Test", "lightRGB"+l+";"); 
     if (convertView == null) 
      view = inflater 
        .inflate(R.layout.light_list_item_lightrgb, null); 
     TextView textView = (TextView) view 
       .findViewById(R.id.light_list_item_lightrgb_label); 
     textView.setText(l.bezeichnung); 
    } 
    Log.d("Test", "end:"+position); 
    return view; 
} 
} 

макет XML (На данный момент все 4 макета я, используя те же, за исключением того, ид Конечно)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:background="@color/black"> 

<TextView 
    android:id="@+id/light_list_item_room_label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:layout_marginTop="20dp" 
    android:textSize="15sp" 
    android:textColor="@color/white"> 
</TextView>  
</LinearLayout> 

ошибка возникает в

else if (obj.typ == EntityTypes.ROOM) 

на линии

TextView textView = (TextView) view.findViewById(R.id.light_list_item_room_label); 

TextView равна нулю здесь, но не всегда, только если я, прокручивая в первый раз одна из строк возвращает нуль для TextView.

Любые идеи? Благодаря Florian

ответ

2

Вы можете использовать различные схемы в методе getView(). Таким образом, вы должны правильно использовать getItemViewId(), getViewTypeCount().

Как вы использовали 4 макета, ваш getViewTypeCount() должен вернуть 4, и вы можете реализовать getItemViewId(), проверив obj.typ.

getItemViewId() должна возвращать 0 до 3.

исх: http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)

+0

спасибо, что привели меня к беговой решение! – user2071938

0
if (convertView == null){ 
      view = inflater.inflate(R.layout.light_list_item_room, null); 
     } 

Если представление не является нулевым и раздутые с R.layout.light_list_item_floor тогда, когда тип OBJ место, он не будет раздувать «нового типа». Когда вы попытаетесь достать комнату с текстом из уже завышенного поля просмотра, он вернет «нуль».

Постарайтесь учитывать, что при повторном использовании вы не используете другой вид.

Как и другие ответы выше, вы должны реализовать getItem, потому что на данный момент каждый раз возвращается null.

0

Сначала правильно реализуйте методы. GetItem(), GetItemId .. вернуть то, что необходимо для возврата.

Тогда для Inflater попробовать:

_view = inflater.inflate(R.layout.youhou, group, false); 
0

вы должны реализовать GetItem и getItemId