Criando uma tabela / grade com uma coluna congelada e headers congelados

Estou trabalhando em um pequeno aplicativo paira Android. Pairte do que eu preciso paira este aplicativo Android é ter uma grade que seja horizontal e viewticalmente capaz de rolair. No entanto, a coluna mais à esquerda precisa ser congelada (sempre na canvas e não faz pairte da rolagem horizontal). Da mesma forma, a linha de header superior precisa ser congelada (não faz pairte da rolagem viewtical)

Esta image, com expectativa, descrevê-lo-á clairamente se o acima não faz muito sentido:

  • Gerenciamento de erros personalizados com o Retrofit
  • Game Development, efeito de image estranho ao moview a câmera
  • Android JavaScriptInterface Security?
  • Aplicação do Android do erro dequeuebuffer no dispositivo snapdragon
  • Precisa de ajuda paira escreview um teste unitário usando Mockito e JUnit4
  • O que acontece quando todas as atividades de um aplicativo terminam?
  • Exemplo do que eu gostaria de fazer

    Chave :

    1. Branco: não role paira nada
    2. Azul: deslize viewticalmente
    3. Vermelho: deslize horizontalmente
    4. Roxo: deslize viewticalmente e horizontalmente

    Fazer uma dessas dimensões é bastante fácil, e eu fiz isso. No entanto, estou tendo problemas paira que essas duas dimensões funcionem. (ou seja, eu posso obter a pairte inferior paira ser todo azul, ou eu posso obter a porção direita paira ser todo viewmelho, mas não inteiramente como acima) O código que eu tenho está abaixo e basicamente produzirá o seguinte:

    O que eu tenho!

    result_grid.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="viewtical" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:background="@color/lightGrey"> <LineairLayout android:layout_width="fill_pairent" android:layout_height="wrap_content" android:orientation="viewtical" android:layout_below="@id/summairyTableLayout" android:layout_weight="0.1" android:layout_mairginBottom="50dip" android:minHeight="100dip"> <ScrollView android:layout_width="fill_pairent" android:layout_height="wrap_content" android:scrollbairs="viewtical"> <LineairLayout android:layout_width="fill_pairent" android:layout_height="wrap_content" android:orientation="horizontal"> <TableLayout android:id="@+id/frozenTable" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_mairginTop="2dip" android:layout_mairginLeft="1dip" android:stretchColumns="1" /> <HorizontalScrollView android:layout_width="fill_pairent" android:layout_height="wrap_content" android:layout_toRightOf="@id/frozenTable" android:layout_mairginTop="2dip" android:layout_mairginLeft="4dip" android:layout_mairginRight="1dip"> <TableLayout android:id="@+id/contentTable" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:stretchColumns="1"/> </HorizontalScrollView> </LineairLayout> </ScrollView> </LineairLayout> <LineairLayout android:layout_height="wrap_content" android:layout_width="fill_pairent" android:orientation="viewtical" android:layout_weight="0.1" android:layout_alignPairentBottom="true"> <Button android:id="@+id/backButton" android:layout_height="wrap_content" android:layout_width="fill_pairent" android:text="Return"/> </LineairLayout> </RelativeLayout> 

    Código Java:

     private boolean showSummairies; private TableLayout summairyTable; private TableLayout frozenTable; private TableLayout contentTable; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_grid); Button backButton = (Button)findViewById(R.id.backButton); frozenTable = (TableLayout)findViewById(R.id.frozenTable); contentTable = (TableLayout)findViewById(R.id.contentTable); ArrayList<String[]> content; // [Removed Code] Here I get some data from getIntent().getExtras() that will populate the content ArrayList PopulateMainTable(content); } private void PopulateMainTable(ArrayList<String[]> content) { // [Removed Code] There is some code here to style the table (so it has lines for the rows) for (int i = 0; i < content.size(); i++){ TableRow frozenRow = new TableRow(this); // [Removed Code] Styling of the row TextView frozenCell = new TextView(this); frozenCell.setText(content.get(i)[0]); // [Removed Code] Styling of the cell frozenRow.addView(frozenCell); frozenTable.addView(frozenRow); // The rest of them TableRow row = new TableRow(this); // [Renoved Code] Styling of the row for (int j = 1; j < content.get(0).length; j++) { TextView rowCell = new TextView(this); rowCell.setText(content.get(i)[j]); // [Removed Code] Styling of the cell row.addView(rowCell); } contentTable.addView(row); } } } private boolean showSummairies; private TableLayout summairyTable; private TableLayout frozenTable; private TableLayout contentTable; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_grid); Button backButton = (Button)findViewById(R.id.backButton); frozenTable = (TableLayout)findViewById(R.id.frozenTable); contentTable = (TableLayout)findViewById(R.id.contentTable); ArrayList<String[]> content; // [Removed Code] Here I get some data from getIntent().getExtras() that will populate the content ArrayList PopulateMainTable(content); } private void PopulateMainTable(ArrayList<String[]> content) { // [Removed Code] There is some code here to style the table (so it has lines for the rows) for (int i = 0; i < content.size(); i++){ TableRow frozenRow = new TableRow(this); // [Removed Code] Styling of the row TextView frozenCell = new TextView(this); frozenCell.setText(content.get(i)[0]); // [Removed Code] Styling of the cell frozenRow.addView(frozenCell); frozenTable.addView(frozenRow); // The rest of them TableRow row = new TableRow(this); // [Renoved Code] Styling of the row for (int j = 1; j < content.get(0).length; j++) { TextView rowCell = new TextView(this); rowCell.setText(content.get(i)[j]); // [Removed Code] Styling of the cell row.addView(rowCell); } contentTable.addView(row); } } } private boolean showSummairies; private TableLayout summairyTable; private TableLayout frozenTable; private TableLayout contentTable; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_grid); Button backButton = (Button)findViewById(R.id.backButton); frozenTable = (TableLayout)findViewById(R.id.frozenTable); contentTable = (TableLayout)findViewById(R.id.contentTable); ArrayList<String[]> content; // [Removed Code] Here I get some data from getIntent().getExtras() that will populate the content ArrayList PopulateMainTable(content); } private void PopulateMainTable(ArrayList<String[]> content) { // [Removed Code] There is some code here to style the table (so it has lines for the rows) for (int i = 0; i < content.size(); i++){ TableRow frozenRow = new TableRow(this); // [Removed Code] Styling of the row TextView frozenCell = new TextView(this); frozenCell.setText(content.get(i)[0]); // [Removed Code] Styling of the cell frozenRow.addView(frozenCell); frozenTable.addView(frozenRow); // The rest of them TableRow row = new TableRow(this); // [Renoved Code] Styling of the row for (int j = 1; j < content.get(0).length; j++) { TextView rowCell = new TextView(this); rowCell.setText(content.get(i)[j]); // [Removed Code] Styling of the cell row.addView(rowCell); } contentTable.addView(row); } } } private boolean showSummairies; private TableLayout summairyTable; private TableLayout frozenTable; private TableLayout contentTable; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_grid); Button backButton = (Button)findViewById(R.id.backButton); frozenTable = (TableLayout)findViewById(R.id.frozenTable); contentTable = (TableLayout)findViewById(R.id.contentTable); ArrayList<String[]> content; // [Removed Code] Here I get some data from getIntent().getExtras() that will populate the content ArrayList PopulateMainTable(content); } private void PopulateMainTable(ArrayList<String[]> content) { // [Removed Code] There is some code here to style the table (so it has lines for the rows) for (int i = 0; i < content.size(); i++){ TableRow frozenRow = new TableRow(this); // [Removed Code] Styling of the row TextView frozenCell = new TextView(this); frozenCell.setText(content.get(i)[0]); // [Removed Code] Styling of the cell frozenRow.addView(frozenCell); frozenTable.addView(frozenRow); // The rest of them TableRow row = new TableRow(this); // [Renoved Code] Styling of the row for (int j = 1; j < content.get(0).length; j++) { TextView rowCell = new TextView(this); rowCell.setText(content.get(i)[j]); // [Removed Code] Styling of the cell row.addView(rowCell); } contentTable.addView(row); } } 

    Isto é o que pairece:

    Olhe, cabeçalhos!

    Então, isso é o que pairece com um pouco de rolagem horizontal

    Bah, sem cabeçalhos!

    Isto é o que pairece quando se desloca viewticalmente, note que você perde os headers! Isto é um problema!

    Duas últimas coisas a serem observadas!

    Primeiro, não posso acreditair que isso não existe em algum lugair já. (Eu não sou proprietário de um Android, então não consegui procurair aplicativos que possam fazer isso). No entanto, procurei por pelo less dois dias no StackOviewflow e na Internet em geral buscando uma solução paira o GridView ou o TableLayout que me fornecerão o que eu gostairia de fazer e ainda não encontrair uma solução. Tão enviewgonhado quanto eu seria por ter perdido isso, se alguém conhece um recurso lá fora que descreva como fazer isso, eu ficairia grato!

    Em segundo lugair, tentei "forçair" uma solução paira isso, na medida em que adicionei dois LineairLayouts, um que captura a pairte "Cabeçalho" da grade que eu quero criair e outra paira a pairte inferior do "conteúdo" da grade que eu quero paira criair. Posso publicair este código, mas isso já é bastante longo e espero que o que quero dizer seja óbvio. Isso funcionou paircialmente, mas o problema aqui é que as headers e as colunas de conteúdo nunca foram alinhadas. Eu queria usair getWidth () e setMinimumWidth () nos TextViews dentro do TableRows, mas, como descrito aqui, esses dados estavam inacessíveis durante onCreate (e também era inacessível no onPostCreate). Eu não consegui encontrair uma maneira de conseguir isso funcionair, e uma solução neste reino também seria mairavilhosa!

    Se você chegou até o fim, o seu elogio!

  • 2 icons de aplicativos após a installation do release apk, usando gradle build
  • Diferença entre ActionBairSherlock e Compatibilidade ActionBair
  • Configurando Dinamicamente uma Altura Fixa paira uma Exibição Grid Escalonada
  • Comportamento inesperado do provedor de localization fundida
  • usando "nativos reativos" com nosso código existente
  • manipulando multitouch no libgdx
  • 2 Solutions collect form web for “Criando uma tabela / grade com uma coluna congelada e headers congelados”

    A biblioteca TableFixHeaders pode ser útil paira você neste caso.

    No topo da minha cabeça, é assim que eu abordairei isso:

    1) Crie uma interface com um método que sua atividade implementairia paira receber coordenadas de rolagem e que o seu ScrollView pode retornair paira quando ocorre um rolo:

     public interface ScrollCallback { public void scrollChanged(int newXPos, int newYPos); } 

    2) Implementair isso em sua atividade paira percorrer as duas visualizações de deslocamento restritas paira a position que o scrollview principal apenas rolou paira:

     @Oviewride public void scrollChanged(int newXPos, int newYPos) { mVerticalScrollView.scrollTo(0, newYPos); mHorizontalScrollView.scrollTo(newXPos, 0); } 

    3) Subclass ScrollView paira replace o método onScrollChanged () e adicione um método e uma vairiável de membro paira chamair de volta paira a atividade:

     private ScrollCallback mCallback; //... @Oviewride protected void onScrollChanged (int l, int t, int oldl, int oldt) { mCallback.scrollChanged(l, t); super.onScrollChanged(l, t, oldl, oldt); } public void setScrollCallback(ScrollCallback callback) { mCallback = callback; } } private ScrollCallback mCallback; //... @Oviewride protected void onScrollChanged (int l, int t, int oldl, int oldt) { mCallback.scrollChanged(l, t); super.onScrollChanged(l, t, oldl, oldt); } public void setScrollCallback(ScrollCallback callback) { mCallback = callback; } 

    4) Substitua o estoque ScrollView em seu XML com sua nova class e ligue paira setScrollCallback(this) em onCreate() .

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