1

リストが更新されるたびに、強制的にリストの一番下までスクロールするリストビューがあります。ただし、リストの一番下までスクロールすると、何らかの理由でリストビューがその時点で固定され、ユーザーはリストを前後にスクロールして他のデータを表示できなくなります。

質問: の後setSelection(list.getBottom())で、リスト全体をもう一度スクロールできるようにするには、何が必要ですか?

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        /* the list is being populated here - the code has been omitted */          

            list.populateFrom(date, name, class);
            list.clearFocus();
            list.post(new Runnable() {

                @Override
                public void run() {

                    list.setSelection(list.getBottom());
                }
            });


        return list;
    }
}
4

3 に答える 3

3

問題は、あなたが電話しているという事実にあります

 list.setSelection(list.getBottom());

これは、ListView がより多くのビューを描画する必要があるたびにgetView()呼び出されます。これは、常に下にスクロールすることを意味します。

代わりに、クラスの外部Adapter( などActivity/Fragment) から持っているデータ セットを更新してから、 のアダプタをリセットするかListView、アダプタをクリアしてアイテムを読み込んでから、 を呼び出しますsetSelection()

これを行う1つの方法:

  • Activityを開始しますAsyncTask

  • AsyncTaskListを介してデータの a を更新しますdoInBackground()

  • では、渡された fromで をonPostExecute()インスタンス化します。または、現在持っているのデータ セットをクリアしてから、リストをループして項目を に再度追加します。AdapterListdoInBackground()AdapterAdapter

  • を再インスタンス化する場合は、 を作成したものAdapterに設定しListViewますAdapter

  • 電話ListView#setSelection()

于 2013-03-10T05:03:08.243 に答える
0

A--Cによって示唆されているように、それは問題です

list.setSelection(list.getBottom());

getView()が呼び出されるたびに、ビューを下に移動/スクロールします。したがって、ビューをもう一度スクロールしようとすると、getView()が呼び出され、再び下に移動します。したがって、リストビューの選択をgetView()の一番下に設定する代わりに、アクティビティ/フラグメントで設定する必要があります。アクティビティでは、変更を観察し、選択を一番下に設定します。

これがあなたの問題の説明に役立った場合は、賛成票を投じてください

于 2013-03-10T05:39:34.900 に答える
0
   cus= new Customlistadapter(paramets for customer adapter));//Custom list adapter
   lv1 = (ListView) findViewById(R.id.list);
   lv1.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
   lv1.setStackFromBottom(true);
   cus.notifyDataSetChanged();// for refreshing listview with updates
   lv1.setAdapter(cus);
   cus.registerDataSetObserver(new DataSetObserver() {
   @Override
   public void onChanged() {
    super.onChanged();
    lv1.setSelection(cus.getCount() - 1);    
   }
 });

アクティビティ クラスで上記を使用します。A--C は問題を指摘しました。

アクティビティ クラスで AysncTask を使用している場合は、以下のコードを試してください。

  private class DownloadFilesTask extends AsyncTask<Void, Void, VOid> {
 protected void onPreExecute()
 {
     //display progress dialog
 }
 protected Long doInBackground(Void... params) {
   // get data from server
     return null;
 }


 protected void onPostExecute(Void params) {
  // dismiss dialog
  //set  data
  // paste the above listview code here. 
 }

}

于 2013-03-10T05:12:50.473 に答える