1

ハンドラーの 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 を引き起こす行です。

リストをジャンプさせずに、そこに必要なデータを取得するこの状況をどのように処理すればよいですか?

4

1 に答える 1

2

アダプター自体を更新するのではなく、アダプター自体を更新するのが好ましい方法だと思います。insert()アダプターとメソッドを使用して、新旧のデータをマージするメソッドを作成できるかもしれませんremove()。私はそれがあなたの立場を維持するべきだと思います。

追加情報:

基本構造として以下を使用します。多分それは役立ちます。


public class PlaylistAdapter extends ArrayAdapter<Playlist> {

    private ArrayList<Playlist> items;

    public PlaylistAdapter(Context context, int textViewResourceId, ArrayList<Playlist> items) {
        super(context, textViewResourceId, items);
        this.items = items;
    }

}
于 2010-09-07T16:52:38.903 に答える