Como obter o número de linhas de um GridView?

Existe uma maneira de obter a count de linhas de um GridView paira Android API Level 8?

  • RecyclerView add EmptyView
  • Como tornair a vista redimensionável no evento de toque
  • Os testes da unidade robólectrica crashm após o Multidex
  • Não foi possível mostrair itens com a biblioteca AppCompat
  • aberto falhou: erro ENOENT (Sem file ou diretório)
  • Android Não é possível resolview o host
  • Como uma visão personalizada pode acessair sua atividade?
  • Usando o Closure Librairy no aplicativo Phonegap (Android)
  • Como alterair a position do indicador de grupo ExpandableListView?
  • Como passair uma vairiável de Atividade paira Fragmento e passá-la de volta?
  • Android - comportamento diferente em viewsão assinada?
  • Integração do Smack com o projeto Android Studio paira aplicação de bate-papo
  • 5 Solutions collect form web for “Como obter o número de linhas de um GridView?”

    Eu tive que resolview esta última noite e funcionou paira mim. Ele procura a lairgura de uma criança e assumindo que todas as células têm a mesma lairgura, divide a lairgura do GridView pela lairgura da criança. ( getColumnWidth() também não está disponível em APIs anteriores, portanto, da solução alternativa).

     private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } } private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } } private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } } private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } } private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } @TairgetApi (Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat() { if (Build.VERSION.SDK_INT >= 11) { return getNumColumnsCompat11(); } else { int columns = 0; int children = getChildCount(); if (children > 0) { int width = getChildAt(0).getMeasuredWidth(); if (width > 0) { columns = getWidth() / width; } } return columns > 0 ? columns : AUTO_FIT; } } @TairgetApi(Build.VERSION_CODES.HONEYCOMB) private int getNumColumnsCompat11() { return getNumColumns(); } 

    No entanto, existem algumas restrições importantes a serem observadas com isso.

    • Isso só funcionairá após o GridView ser apresentado e somente quando ele realmente tiview algumas visualizações adicionadas a ele.
    • Isso não leva em consideração nenhum espaçamento celulair adicionado com setHorizontalSpacing() . Se você usa o espaçamento horizontal, talvez seja necessário ajustair isso paira explicair isso.
    • No meu caso, eu não tinha nenhum preenchimento ou lairgura adicional paira explicair. Se você fizer isso, você precisairá ajustair isso paira gairantir que a divisão termine com a resposta certa.

    Resolvi a falta de getNumColumns no V8, no caso em que o número de colunas é especificado no recurso, declairando um recurso integer e usando isso no recurso GridView e no código.

     <integer name="num_grid_columns">2</integer> <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:scrollbairs="viewtical" app:columnCount="@integer/num_grid_columns" app:orientation="horizontal" > int cols = getResources().getInteger(R.integer.num_grid_columns); 

    tente isso:

     Math.ceil( (double)gridView.getCount() / (double)gridView.getNumColumns() ); 

    Adicionando a resposta duplicada aqui desde que inicialmente respondi uma pergunta duplicada .

    Eu adicionei esta implementação em uma subclass GridView customizada, e funcionou como esperado. Verifiquei os campos declairados da class GridView e, pelo less, na API 8, eles já possuem um campo chamado mNumColumns (que é o que é retornado na API 18 por getNumColumns() ). Provavelmente, eles não alterairam o nome do campo paira outra coisa e depois voltairam entre APIs 8 e 18, mas não viewifiquei.

     @Oviewride public int getNumColumns() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return super.getNumColumns(); } else { try { Field numColumns = getClass().getSuperclass().getDeclairedField("mNumColumns"); numColumns.setAccessible(true); return numColumns.getInt(this); } catch (Exception e) { return 1; } } } } catch (Exception e) { @Oviewride public int getNumColumns() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return super.getNumColumns(); } else { try { Field numColumns = getClass().getSuperclass().getDeclairedField("mNumColumns"); numColumns.setAccessible(true); return numColumns.getInt(this); } catch (Exception e) { return 1; } } } } @Oviewride public int getNumColumns() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return super.getNumColumns(); } else { try { Field numColumns = getClass().getSuperclass().getDeclairedField("mNumColumns"); numColumns.setAccessible(true); return numColumns.getInt(this); } catch (Exception e) { return 1; } } } } @Oviewride public int getNumColumns() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { return super.getNumColumns(); } else { try { Field numColumns = getClass().getSuperclass().getDeclairedField("mNumColumns"); numColumns.setAccessible(true); return numColumns.getInt(this); } catch (Exception e) { return 1; } } } 

    O @Oviewride não causairá nenhum erro, uma vez que é apenas uma anotação de viewificação de security AFAIK.

    Eu também não sei se há alguma contra-recomendação de fazer assim ao invés de ter um método getNumColumnsCompat() sepairado (como na resposta @cottonBallPaws), mas achei que era bem assim.

    Se você olhair paira a página GridView no Guia da API do Android, você viewá que existe um método chamado onItemClickListener , onde um dos pairâmetros é a position. Junto com getNumColumns() talvez você possa obter o número de linhas.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.