0

UIに次の構造があります

    <ScrollView
        android:id="@+id/vscroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TableLayout
            android:id="@+id/table"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </TableLayout>

    </ScrollView>

プログラムで TableLayout に TableRows を入力します。

テーブルの上部に行を追加する必要がある場合があります (child(0) の前に挿入)。
そして問題は、ScrollView が跳ね上がることです。行挿入の前後に ScrollViewのScrollY()
位置 をログに記録したことがわかります。そして相変わらずです( !!)

これがジャンプの原因です。これがジャンプの原因です。これは、行 A にある前に行とスクロール位置 Y = 234 (たとえば) があり、同じ位置 Y が行 Q を意味するためです。

行 A は (たとえば) 5 行目で、挿入後は行 Q が 5 行目
です。ご覧のとおり、ScrollView の観点からは何も変わっていませんが、View には別の行が表示されています。

この時点で私の説明に完全に混乱していない場合は、画面に表示される内容を変更せずに上部に行を挿入する方法をアドバイスしてください。
言い換えれば、ユーザーが見るものに影響を与えることなく、挿入をステルスにしたいのです。

いくつかのコードが画像をクリアするのに役立つ場合、上部に5行を挿入する方法は次のとおりです

table = (TableLayout) findViewById(R.id.table);
TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
for(int i=0; i<5 ; i++) {   
    TableRow mr = new TableRow(getContext());
    // some stuff to set the row texts
    table.addView(mr, 0, params);
}

Before Insertion    After Insertion
Row 0               New Row 0
Row 1               New Row 1
Row 2               New Row 2
Row 3               New Row 3        <--- vscroll Y position stays the same
Row 4               New Row 4
Row 5               Old Row 0
Row 6               Old Row 1
Row 7               Old Row 2
Row 8               Old Row 3        (vscroll jumps up from here to new Row 3)
Row 9               Old Row 4
Row 10              Old Row 5
Row 11              Old Row 6
4

1 に答える 1

1

私はそれをテストしていませんが、新しく挿入された行の高さを取得し、その量だけスクロールして同じ位置に留まるようにすることができますpost():RunnableScrollView

final TableRow newRow = new TableRow(this);
        // add stuff to the row     
        tl.addView(newRow, 0, params);
        // sv is your ScrollView vscroll
        sv.post(new Runnable() {

            @Override
            public void run() {             
                int size = newRow.getHeight();              
                sv.scrollBy(0, size);
            }

        });
于 2012-06-07T06:21:17.223 に答える