Проблемы выравнивания с динамически заполненной таблицей, имеющей фиксированную строку заголовка (проблема синхронизации) - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь динамически построить таблицу с фиксированной строкой заголовка. Сборка берет данные из сети, поэтому она запускается из Задачи. Проблема заключается в следующем:

Если задача занимает больше определенного времени, код выравнивания заголовка не работает должным образом.

Посмотрите на вызов thread.sleep. Если значение больше 0, строка заголовка не будет выровнена, в противном случае будет работать как ожидалось.

У меня закончились идеи. Пробовал requestLayout (), invalidate (), forceLayout () в корневом представлении и везде, о чем я мог подумать.

Есть идеи?

Вот макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:keepScreenOn="true">
<LinearLayout android:id="@+id/header"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <LinearLayout android:id="@+id/bodyheader"
                  android:orientation="horizontal"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="X"/>
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="Y"/>
    </LinearLayout>
</LinearLayout>
<ScrollView android:id="@+id/body"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/header">
    <hu.dwim.test.TableView android:id="@+id/bodytable"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"/>
</ScrollView>
</RelativeLayout>

Вот код для класса TableView, который пытается выровнять свой заголовок:

package hu.dwim.test;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class TableView extends TableLayout {
private LinearLayout header;

public TableView(Context context) {
    super(context);
}

public TableView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public LinearLayout getHeader() {
    return header;
}

public void setHeader(LinearLayout header) {
    this.header = header;
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    TableRow firstRow = getChildCount() > 0 ? (TableRow)getChildAt(0) : null;
    if (firstRow != null) {
        for (int i = 0; i < header.getChildCount(); i++) {
            TextView textView = (TextView)header.getChildAt(i);
            textView.setWidth(firstRow.getChildAt(i).getWidth());
        }
    }
}
}

А вот код для задания и задачи:

package hu.dwim.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class TestActivity extends Activity {
private TableView tableView;

private class FillTask extends AsyncTask<Object, Object, Object> {
    @Override
    protected Object doInBackground(Object... params) {
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return null;
    }

    protected void onPostExecute(Object result) {
        tableView.removeAllViews();
        for (int i = 0; i < 10; i++) {
            TableRow tableRow = new TableRow(TestActivity.this);
            TextView textView = new TextView(TestActivity.this);
            textView.setText("Hello world");
            tableRow.addView(textView);
            textView = new TextView(TestActivity.this);
            textView.setText("Shouldn't this work");
            tableRow.addView(textView);
            tableView.addView(tableRow);
        }
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tableView = (TableView)findViewById(R.id.bodytable);
    tableView.setHeader((LinearLayout)findViewById(R.id.bodyheader));
    tableView.removeAllViews();
    new FillTask().execute(null);
}
}

1 Ответ

0 голосов
/ 01 декабря 2011

Похоже, я наконец нашел ответ сразу после публикации вопроса ...: (

Код, который обновляет заголовок, должен запускаться из нового обработчика (). Post (new Runnable ())...

не знаю почему

...