ハンドラーの postDelayed() メソッドを介して 2 秒ごとに更新されるリストがあります。
2 秒ごとに AsyncTask が実行され、HTTP GET 要求が行われ、JSON がオブジェクトのリストに変換され、ListAdapter が設定されます。
MyListAdapter adapter = new MyListAdapter(someObjects);
setListAdapter(adapter);
私の問題は、タスクが完了するたびに (つまり、約 2 秒ごとに) リストの真ん中または一番下までスクロールしても、リストが一番上に戻ってしまうことです。これはエンド ユーザーにとって非常に煩わしいので、バックグラウンドでリストを更新する必要がありますが、AsyncTask の完了時にリストの現在のビューがトップに戻らないようにします。
必要なコードをさらに含めることができます。私はAndroid開発に少し慣れていないので、他の人にとって何が役立つかわかりません。
追加情報
hacksteak25 からの提案を受けて、アダプターからすべてのデータを削除してから、一度に 1 つのオブジェクトを追加し直すところまで到達できました。おそらくこれでも画面がジャンプする可能性があるため、これは最終的な解決策ではありませんが、ある時点でデータをマージする方法の概念実証として使用しようとしています.
私の問題は、次のコードを呼び出すことです。
MyListAdapter adapter = (MyListAdapter)getListAdapter();
adapter.clear();
for(MyObject myObject : myObjects)
{
adapter.add(myObject);
}
「add(myObject)」への最初の呼び出しの後、MyListAdapter の getView() メソッドが呼び出されています。カスタム アダプターのプライベート内部 ArrayList は、onCreate() で myObjects を使用せずにアダプターを設定したか、アダプターで clear() を呼び出したため、この時点では空です。いずれにせよ、ビューを取得するオブジェクトが ArrayList にないため、これにより getView が失敗します。
getView() は次のようになります。
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
LayoutInflater mInflater = getLayoutInflater();
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.myObject, null);
holder = new ViewHolder();
holder.someProperty = (TextView)convertView.findViewById(R.id.someProperty);
holder.someOtherProperty = (TextView)convertView.findViewById(R.id.someOtherProperty);
holder.someOtherOtherProperty = (TextView)convertView.findViewById(R.id.someOtherOtherProperty);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
// Bind the data efficiently with the holder.
holder.someProperty.setText( mObjects.get(position).getSomeProperty());
...
その最後の行は、IndexOutOfBoundsException を引き起こす行です。
リストをジャンプさせずに、そこに必要なデータを取得するこの状況をどのように処理すればよいですか?