2

私はその問題に関するすべての研究を行った。グーグルはそれが無意味だと考えていること、そして開発者はそうではないことを知っていることを私は知っています。また、既知の回避策がないことも知っていますが、回避策を作成するところです。ユーザーDougWはこのコードを投稿しました:

public 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);
    }
}

それはほとんど私のために仕事を成し遂げます。しかし、試してみると、listItem.measure(0、0)行でNullPointer例外が発生します。listItem自体は初期化されますが、メソッドはとにかく例外をスローします。これを修正する方法を教えてください。

これが私のコードです:

public class ExpenseReportsActivity extends Activity {

    private ListView lvReports;
    private ExpenseReportListAdapter adapter;
    private Button btnSend;
    private Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expensereports);

        lvReports = (ListView)findViewById(R.id.lv_reports);
        lvReports.setBackgroundResource(R.drawable.shape_expense_report_list);

        ColorDrawable cd = new ColorDrawable(0xFFffffff);
        lvReports.setDivider(cd);
        lvReports.setDividerHeight(1);

        adapter = new ExpenseReportListAdapter(this);
        lvReports.setAdapter(adapter);

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

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

私が取り組んでいる別の回避策は、カスタムビューのonWindowFocusChangedメソッドを使用することです。ビューの正確な高さを示します。問題は、ActiviyのonCreateメソッドでも、ActivityのonWindowFocusChangedメソッドでも、イベントが発生しないことです。カスタムイベントを試しましたが、発生しませんでした(カスタムビューのonWindowFocusChangedメソッド内に配置され、リスナーはアクティビティのonWindowFocusChangedメソッド内にありました)。

4

2 に答える 2

9

わかりました、私があなたのニーズを持っている限り、私はあなたがただListView.addFooterView(View v)方法を使うかもしれないと思います:

http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)

これにより、すべてのリストアイテムと「いくつかのボタン」フッターを1つのブロックとしてスクロールできます。

したがって、コードは次のようになります。

import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;

public class YourActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LayoutInflater factory = getLayoutInflater();
        LinearLayout footer = 
            (LinearLayout) factory.inflate(R.layout.your_a_few_buttons_footer, null);

        getListView().addFooterView(footer);

        String[] array = new String[50];
        for (int i = 0; i < 50;) { array[i] = "LoremIpsum " + (++i); }

        setListAdapter(
            new ArrayAdapter<String>(this, R.layout.list_item, array)
        );
    }   
}

ドキュメントには、のaddFooterView()前に呼び出す必要があると書かれていることに注意してくださいsetListAdapter()

更新View:リストの一番上にを追加するには、を使用しますListView.addHeaderView(View v)。たとえば、LinearLayoutもであることに注意してくださいView。したがって、必要なものをヘッダーまたはフッターとして配置でき、リストとともに分割できないブロックとしてスクロールされます。

于 2010-11-06T21:59:42.717 に答える
1

好奇心から、RelativeLayoutを使用しているレイアウトですか?その場合、呼び出しmeasure(0,0)は常にNPEをスローしますが、LinearLayoutはスローしません。 http://groups.google.com/group/android-developers/browse_thread/thread/5a947482d7dcb605

リニアに変更すると、その呼び出しを行うことができます。お役に立てば幸いです。


私のアプリには、テキストの段落、imageviews、特定の主題に関するあらゆる種類の情報がある状況があります...そして、アイテムによっては、そのすべての途中に比較データのListViewがある可能性があります情報。10項目に1つは、すべてのテキストの間に挟まれています。比較データは最大で4アイテムを超えることはないので、ListViewをスクロールさせたくありません。ListView全体を、指定した正確なポイントに表示したいだけです。

それらすべてをネストされた線形レイアウトとして追加するのは非常識です。そのため、画面にListViewが表示されていない場合でも、MergeAdapterを使用してすべてをまとめています。また、複雑なListViewヘッダーとフッターを使用することも問題外です。

私はそのような機能を欲しがる最初の人ではありません、そして私は最後ではありません。上記のソリューションはほぼ完璧です。画面全体に表示されるようにListViewのサイズを変更し、すべてのスクロールはScrollViewの親から行われます。(iOS SDKで罪を犯すのは簡単ですが、そこにある多くのアプリも同様のことをします。これには適切なソリューションが必要です。)

于 2010-11-09T06:29:22.873 に答える