2014-05-03 57 views
1

我需要在列表視圖中的第n個元素之後放置一個分隔符,該列表視圖由mysqli遊標生成。我創建了一個試圖做的是,像這樣的自定義適配器:Android ListView - 第n個元素後的分隔符

MyAdapter extends CursorAdapter { 

    ... 
    blablabla 
    yadayadayada 
    ... 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 

     final View view; 
     int pos = cursor.getPosition(); 
     int beforeLast = GameData.totalPlayers-1; 
     if (pos == beforeLast) { 
      view = mInflater.inflate(R.layout.player_details_divider, parent, false); 
     } else { 
      view = mInflater.inflate(R.layout.player_details, parent, false); 
     } 
     return view; 
    } 
} 

因此,大家可以看到它應該誇大不同的視圖上的位置totalPlayers-1的元素。當數量足夠小時它工作得很好:1到6。但是當它更大時它就停止工作。

我試着調試過這個東西,我發現它呈現6個項目 - 這是多少列表元素適合在屏幕上 - 並通過循環6次遞增pos到5。然後停止。當我開始滾動列表時,它再次運行循環,將pos遞增爲6,然後停止。無論有多少元素,它都不會將pos遞增爲7(儘管所有數據都存在於列表中,因此光標必須迭代到最後)。

任何想法,爲什麼它的行爲是這樣的?這是什麼我不理解/做錯了?

回答

1

問題似乎是由於ListView回收。 ListView將嘗試重複使用相同的視圖的項目。所以在你的情況下,newView被稱爲前6個可見項目,當你滾動ListView調整列表中下一個6項目的相同6項目視圖的大小。

您需要更新ListView,你有2個不同的項目視圖,以便它知道你的最後一個項目的看法是從別人

不同您需要overridegetViewTypeCount,並返回你有2個不同的看法

@Override 
public int getViewTypeCount() { 
    return 2; // return the view type 
} 

此外,overridegetItemViewType並告知ListViewlast position view是一個不同。

Override 
public int getItemViewType(int position){ 
    int beforeLast = GameData.totalPlayers-1; 
    // return a unique number 
    if(beforeLast == position) { 
     return 1; // some unique id 
    }else { 
     return 0; 
    } 
} 
+0

很好,謝謝! – RandomWhiteTrash