現在実装されているコードは、ループを制御してクリックを処理するときに、可視リスト項目のみを考慮しているようです。次の 2 つの動作に注意することが重要です。
まず、Android にはビュー リサイクルと呼ばれる概念があり、ListView を処理するときにメモリを節約するのに役立ちます。現在画面に表示されているビューのみが作成され、画面からスクロールすると、新しいデータが再入力されます。getChildCount
したがって、ListViewで やのようなメソッドを呼び出すとgetChildAt
、これらの操作は表示されているアイテムに対してのみ実行されます。リストに入力されるデータに関する情報を検索するには、ListView のアダプターでgetCount()
またはなどのメソッドを呼び出します。getItem()
第 2 に、このclickInList()
メソッドは、リストの現在の位置を基準にして 1 からインデックス付けされ、表示されているアイテムに対してのみ使用できます。私の知る限り、リストが自動的にスクロールされることはありません。つまりclickInList(2)
、リストの一番上にあるときに呼び出すと 2 番目の項目をクリックしますが、30 番目の項目がリストの一番上にあるときにもう一度呼び出すとclickInList(2)
、32 番目の項目をクリックします。
これら 2 つのことを知った上で、ソリューションではすべてのリスト データを考慮する必要があり、クリックを行う際にもう少し精度が高くなる可能性があります。リストのすべての項目を確実に処理できるように while ループを書き直す方法を次に示します。これがお役に立てば幸いです。
ListAdapter adapter = l.getAdapter();
for(int i=0; i < adapter.getCount(); i++)
{
//Scroll down the list to make sure the current item is visible
solo.scrollListToLine(l, i);
//Here you need to figure out which view to click on.
//Perhaps using adapter.getItem() to get the data for the current list item, so you know the text it is displaying.
//Here you need to click the item!
//Even though you're in a list view, you can use methods such as clickOnText(), which might be easier based on how your adapter is set up
solo.goBack();
}