ListView в ScrollView - небольшая ошибка

Я хотел бы иметь просмотр списка в scrollview. Этот метод делает это почти идеально:https://stackoverflow.com/a/3495908/2811653

При вводе большего количества текста, чем помещается в одну строку, возникает ошибка:

1:http://abload.de/img/screenshot_2013-10-311jq5t.jpg

2:http://abload.de/img/screenshot_2013-10-31lvrad.jpg

Прокрутка вниз до кнопки работает нормально, НО, как вы видите на втором скриншоте, P отображается неправильно :-(

В классе Utility высота вычисляется неправильно, когда я заполняю первую строку списка таким образом.

Кто-нибудь знает как это исправить?

(Подсказка: главное, я хочу прокрутить до кнопки, которая находится под списком. Я нея хочу, чтобы кнопка всегда отображалась (поэтому нет веса = 1))

Код:

package com.example.tmpapplication;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

public class MainActivity extends ListActivity {

static final String[] data=new String[]
{
        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "B",
        "C",
        "D",
        "E",
        "F",
        "G",
        "H",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N",
        "O",
        "P"
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setListAdapter(new ArrayAdapter(this, R.layout.list, data));

    ListView listView=(ListView) findViewById(android.R.id.list);
    Utility.setListViewHeightBasedOnChildren(listView);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() *  (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    }
}

XML: activity_main.xml









list.xml:




Ответы на вопрос(2)

Ваш ответ на вопрос