Q:

How to put a background on ListView?

I'am to develop an activity with ListView. I want to put a background to the ListView but when I lower the image remains on the same side but ListView moves. I want the image is adapted to ListView.
My code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/fondomax" >

<ListView 
    android:id="@+id/lista"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    ></ListView>

I have tried with ScrollView but the ListView only shows the first item.

A:

Create a custom class extending ListView, and override dispatchDraw(...):
public class ScrollableBackgroundListView extends ListView {
    private Bitmap background;

    public ScrollableBackgroundListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
    }

    @Override
    protected void dispatchDraw(@NonNull Canvas canvas) {
        int topPosition;
        if (getChildCount() > 0) {
            topPosition = getChildAt(0).getTop();
        } else {
            topPosition = 0;
        }

        int listViewWidth = getWidth();
        int listViewHeight = getHeight();

        int backgroundWidth = background.getWidth();
        int backgroundHeight = background.getHeight();

        for (int y = topPosition; y < listViewHeight; y += backgroundHeight) {
            for (int x = 0; x < listViewWidth; x += backgroundWidth) {
                canvas.drawBitmap(background, x, y, null);
            }
        }
        super.dispatchDraw(canvas);
    }
}

