Android:StickyGridHeaders:setSelection到一个项目

时间:2014-02-06 21:40:47

标签: android gridview

我正在使用StickyGridHeader库进行gridview。我想根据应在视图中显示的项目将gridview滚动到特定位置。

我已经尝试将setSelection用于我期望使用的gridview中该项的索引,但是它倾向于超出或低于我期望在具有不同列数的网格中的位置。

我可以使用setSelection在一个网格中设置一个正确的位置(基本上是一个列表)并以这种方式查找项目:

    event = getEventThatWeWantByDate();
    //Find and store event's position in the gridview
    for( int i = 0; i < getGridView().getAdapter().getCount(); i++ ) {
        gridEvent = (Event) getGridView().getItemAtPosition( i );
        if( !( gridEvent instanceof Event ) )
            continue;
        if( gridEvent.getEventDate() == event.getEventDate() ) {
            index = i;
            break;
        }
    }

然后我用index来启动它。我还有另一个函数来计算网格中的空白量:

    int blanks = 0;
    int sumOfAllLastRowItems = 0;
    //Get the number of blanks in the grid up until the desired item
    for( int i = 0; i < headers; i++ ) {
        int numOfItemsInLastRow = wrapper.getCountForHeader( i ) % getResources().getInteger( R.integer.event_grid_num_columns );
        //Log.e( TAG, "Num in area: " + numOfItemsInLastRow );
        if( numOfItemsInLastRow != 0 ) {
            sumOfAllLastRowItems += numOfItemsInLastRow;
            int numOfBlankSpaces = ( getResources().getInteger( R.integer.event_grid_num_columns ) ) - numOfItemsInLastRow;
        //  Log.e( TAG, "Adding num of blanks: " + numOfBlankSpaces );
            blanks += numOfBlankSpaces;
        }
        else sumOfAllLastRowItems += getResources().getInteger( R.integer.event_grid_num_columns );
    }

除了我想要的项目之前的标题数量:

    StickyGridHeadersSimpleAdapterWrapper wrapper = new StickyGridHeadersSimpleAdapterWrapper( (StickyEventViewGridAdapter) getAdapter() );
    int headers = 0;
    //Count number of headers before the requested event
    for( int i = 0, j = 0; i < wrapper.getNumHeaders() ; i++ ) {
        j += wrapper.getCountForHeader( i );
        headers++;
        if( j >= arrayIndex ) {
            break;
        }
    }

我已经尝试将空白和标题的数量添加到索引中,如果有两列,则效果很好,但如果我使网格使用3列,它将再次进入不相关的位置。

有什么建议吗?

02-06 16:31:03.147 8711-8711 /? E / EventGridFragment:项目前的标题数:24

02-06 16:31:03.147 8711-8711 /? E / EventGridFragment:粘性网格适配器索引:71

02-06 16:31:03.147 8711-8711 /? E / EventGridFragment:数组适配器索引:45

02-06 16:31:03.147 8711-8711 /? E / EventGridFragment:空白:28

02-06 16:31:03.147 8711-8711 /? E / EventGridFragment:要返回的值:123

当我的列数为3时,我实际上在gridview中查找~150项。

2 个答案:

答案 0 :(得分:1)

StickyGridHeader用空视图填充每一行,包括标题,以填充到numOfColumns。这意味着如果您有一个包含5列的网格,则每个标题将包含5个视图,以及每个空白空间计为视图。我最终不得不计算直到我想要显示的项目的行数并执行此操作:

getGridView.setSelection( ( numOfHeaders + numOfRows ) * getResources().getInteger( R.integer.event_grid_num_columns ) );

答案 1 :(得分:0)

当您在问题的第一个代码块中找到索引时,您没有包装适配器,因此您需要计算所有标题条目以及用于使布局看起来很好的所有空白单元格:

for( int i = 0; i < getGridView().getAdapter().getCount(); i++ ) {
    gridEvent = (Event) getGridView().getItemAtPosition( i )

第二行的便捷方法可以从普通网格视图中获取项目,而不是StickyGridHeaders网格视图。相反,使用:

StickyEventViewGridAdapter adapter = (StickyEventViewGridAdapter) getGridView().getAdapter();

for( int i = 0; i < adapter.getCount(); i++ ) {
    gridEvent = (Event) adapter.getItem(i)

通过包装适配器,您应该避免这种情况,而不必使用其他代码块来计算空白和标题单元格。您将获得的位置将是您在setSelection()

中可以参考的位置