Я пытаюсь динамически построить таблицу с фиксированной строкой заголовка. Сборка берет данные из сети, поэтому она запускается из Задачи. Проблема заключается в следующем:
Если задача занимает больше определенного времени, код выравнивания заголовка не работает должным образом.
Посмотрите на вызов 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);
}
}