天天看點

ListView展示不同布局需要注意的地方

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