尊重勞動成果,轉載請標明出處:http://www.cnblogs.com/tangZH/p/8419010.html 我們在項目中經常需在一個listview中展示不一樣的佈局,我們可以在adapter的getView()中根據position來決定該展示哪些佈局。 我在項目中便是如此,第一個it ...
尊重勞動成果,轉載請標明出處:http://www.cnblogs.com/tangZH/p/8419010.html
我們在項目中經常需在一個listview中展示不一樣的佈局,我們可以在adapter的getView()中根據position來決定該展示哪些佈局。
我在項目中便是如此,第一個item是展示一張圖片(判斷當position==0的時候返回該圖片),而當position不為0的時候返回我們需要的佈局,如下:
ViewHolder viewHolder = new ViewHolder(); if (view == null) { view = mInflater.inflate(R.layout.listview_item, viewGroup, false); viewHolder.textCate = view.findViewById(R.id.discover_text_category); viewHolder.textView = view.findViewById(R.id.discover_view_all); viewHolder.arrow = view.findViewById(R.id.discover_arrow); viewHolder.divider = view.findViewById(R.id.discover_item_divider); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); }
//下麵這裡執行相應的操作,舉一個例子
viewHolder.textCate.setText("A")
可是這時候問題來了,滑動到下麵的時候報錯:找不到組件textCate
苦思良久,最終我是這樣分析的:
listView的item會復用,也就是滑動到下麵的時候,下麵的item會復用第一個item,也就是圖片,然後代碼在判斷view == null的時候不成立,於是執行
viewHolder = (ViewHolder) view.getTag();
而我們沒有給圖片設置tag,取出來的當然為空,因此下麵會報空指針。
有什麼覺方法呢?
其實很簡單,只要在判斷view == null後面再加上一個判斷就行了:
if (view == null || view.getTag() == null)
當view為null或者view取出來的tag也為null的時候,那就需要去重新載入佈局,設置tag