尊重勞動成果,轉載請标明出處: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