ListViewでListViewの背景をスクロールさせようとしています。私はShelvesでこのクラスに基づいてアプローチしていますが、Shelvesではすべてが同じ高さですが、同じ保証をすることはできません。
私はそのような活動をしています:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
List<String> items = new ArrayList<String>();
for(int i=0; i < 100; ++i) {
items.add("Hello " + i);
}
CustomArrayAdapter adapter = new CustomArrayAdapter(this, items);
listView.setAdapter(adapter);
}
}
CustomArrayAdapterは次のとおりです。
public class CustomArrayAdapter extends ArrayAdapter<String> {
private List<Integer> mHeights;
public View getView(int position, View convertView, ViewGroup parent) {
//snip
}
}
私がやりたいのは、アダプターのmHeightsにビューの行の高さを入力することです。
私の主な試みは、getView()でこれを行うことでした:
if(row.getMeasuredHeight() == 0) {
row.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY));
}
mHeights.set(position, row.getMeasuredHeight());
これを行うためにいくつかの方法を試しましたが、何も機能しません。
でgetView
、を呼び出すgetHeight()
と戻り値0がgetMeasuredHeight()
得られますが、を呼び出すとゼロ以外の値が得られますが、実際の高さは得られません。下にスクロールしてからもう一度上にスクロールすると(行の1つが表示されなくなります)getHeight() == getMeasuredHeight()
、両方とも正しい値になります。getViewでmHeightsを更新するだけの場合(と言ってmHeights.set(position, row.getHeight()
); それは機能しますが、ListViewの一番下までスクロールした後でのみです。getViewメソッド内でrow.measure()を呼び出そうとしましたが、これgetHeight()
を最初に実行すると0になります。
私の質問はこれです:リストビューの行の正しい高さでmHeightsを計算して入力するにはどうすればよいですか?私はいくつかの同様の質問を見ましたが、それらは私が探しているものではないようです。このViewTreeObserver
メソッドは有望なようですが、getView()の呼び出しを強制する方法(または、ListViewの行を繰り返す方法)がわかりません。呼び出すadapter.notifyDataSetChanged()
と、無限の(ただしブロッキングではない)ループが発生します。
これは、このテーマに関する私の以前の質問に関連していますが、ポイントを逃したようです:リストの一番上からのListView距離