0

ListViewメモ帳のように、つまり水平線の背景パターンで表示したい。メモ帳のサンプルに従って、次のように拡張TextViewおよびオーバーライドできます。onDraw()

r = new Rect();
for (int i = 0; i < getLineCount(); i++) {
  int baseline = getLineBounds(i, r);
  canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
}
super.onDraw(canvas);

ただし、リストに要素が数個しかない場合は、ページを埋めるのに十分な行がありません(実際の結果は左側にあり、右側に必要です)。

ここに画像の説明を入力してください ~~~ここに画像の説明を入力してください

そこで、別のアプローチを試しました。オーバーライドしますListView.onDraw()。残念ながら、トップスクロールを計算する即時の方法はありません(getScrollY()常に戻ります0)。何よりも、すべてのキャッシュと描画の最適化を無効にする必要があります。これにより、大きなリストに対してスケーラブルでないことを除いて、パフォーマンスが確実に低下します。

最後に、私の行ウィジェットはプレーンテキストビューではありません。メインコンテンツが-sure-aであっても、これらは複雑なレイアウトTextViewです。つまり、レイアウト内では呼び出すことができずgetLineBounds()(レイアウトはテキストビューではありません)、テキストビューでTextViewは周囲のレイアウトよりも小さいため呼び出すことができないため、4つの側面にギャップが生じます。

カスタムウィジェットを表示し、ウィンドウ全体を水平線で埋めるソリューションを設計するにはどうすればよいですか?単純なアプローチは、使用可能なすべてのスペースに収まる限り、ダミーの空の要素をリストに追加することですが、これはハックであり、より良い方法が必要です。線の間の距離は実行時にカスタマイズ可能でなければならないため、背景画像を使用することはできません。

4

1 に答える 1

3

以下のコードは、質問の簡単な例TextView、下部に線を引く(リストに仕切りがない)カスタムに基づいています。この場合、カスタムを作成し、以下のようにメソッドListViewをオーバーライドします。dispatchDraw

class CustomListView extends ListView {

    private Paint mPaint = new Paint();
    private Paint mPaintBackground = new Paint();

    public CustomListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint.setColor(Color.RED);
        mPaintBackground.setColor(Color.CYAN);
    }       

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        // ListView's height
        final int currentHeight = getMeasuredHeight();
        // this will let you know the status for the ListView, fitting/not
        // fitting content
        final int scrolledHeight = computeVerticalScrollRange();
        if (scrolledHeight >= currentHeight || scrolledHeight == 0) {
            // there is no need to draw something(for simplicity I assumed that
            // if the adapter has no items i wouldn't draw something on the
            // screen. If you still do want the lines then pick a decent value
            // to simulate a row's height and draw them until you hit the
            // ListView's getMeasuredHeight)
            return;
        } else {
            // get the last drawn child
            final View lastChild = getChildAt(getChildCount() - 1);
            // values used to know where to start drawing lines
            final int lastChildBottom = lastChild.getBottom();
            // last child's height(use this to determine an appropriate value
            // for the row height)
            final int lastChildHeight = lastChild.getMeasuredHeight();
            // determine the number of lines required to fill the ListView
            final int nrOfLines = (currentHeight - lastChildBottom)
                    / lastChildHeight;
            // I used this to simulate a special color for the ListView's row background
            Rect r = new Rect(0, lastChildBottom, getMeasuredWidth(),
                    getMeasuredHeight());           
            canvas.drawRect(r, mPaintBackground);
            for (int i = 0; i < nrOfLines; i++) {
                canvas.drawLine(0, lastChildBottom + (i + 1) * lastChildHeight,
                        getMeasuredWidth(), lastChildBottom + (i + 1)
                                * lastChildHeight, mPaint);
            }
        }
    }

}

上記のコードを使用して、自分のニーズに適合させることができるかどうかを確認してください。

于 2012-10-05T09:10:27.860 に答える