9

アプリでタイマーを設定すると、Web サービスから情報を取得でき、リスト ビューが表示されました。今私の問題は、タイマーが実行されるたびに、スクロールして最初に戻ることです...

リストビューで更新するたびにスクロール位置を維持するにはどうすればよいですか?

私のコードの一部:

runOnUiThread(new Runnable() {
    public void run() {
        /**
         * Updating parsed JSON data into ListView
        * */
        ListAdapter adapter = new SimpleAdapter(DashboardActivity.this, 
                                                all_chat, 
                                                R.layout.list_item, 
                                                new String[] { TAG_FULLNAME,
                                                               TAG_DATE, 
                                                               TAG_MESSAGE }, 
                                                new int[] { R.id.fullname,
                                                            R.id.date, 
                                                            R.id.message }
                                               );
        // updating listview
        setListAdapter(adapter);
    }
});

TNx。

4

4 に答える 4

14

電話しないでくださいsetAdapter()。次のようにします。

ListAdapter adapter; // declare as class level variable

runOnUiThread(new Runnable() {
    public void run() {
        /**
         * Updating parsed JSON data into ListView
         */
        if (adapter == null) {
            adapter = new SimpleAdapter(
                    DashboardActivity.this, all_chat, R.layout.list_item, new String[]{TAG_FULLNAME, TAG_DATE, TAG_MESSAGE},
                    new int[]{R.id.fullname, R.id.date, R.id.message});
            setListAdapter(adapter);
        } else {
            //update only dataset   
            allChat = latestetParedJson;
            ((SimpleAdapter) adapter).notifyDataSetChanged();
        }
        // updating listview
    }
});
于 2013-10-09T12:14:47.177 に答える
2

私は同じ問題を抱えていました。リストのスクロール位置が変更されないように、次のような多くのことを試しました。

android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"

この答えlistView.setAdapter(); が見つかるまで、どれも機能しませんでした:

次のようになります。

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());

// ...

// restore index and position
mList.setSelectionFromTop(index, top);

説明:

ListView.getFirstVisiblePosition()一番上に表示されているリスト項目を返します。しかし、この項目は部分的にスクロールされて見えなくなる可能性があり、リストの正確なスクロール位置を復元したい場合は、このオフセットを取得する必要があります。SoListView.getChildAt(0)View、一番上のリスト項目の をView.getTop() - mList.getPaddingTop()返し、 の一番上からの相対オフセットを返しますListView。次に、ListViewのスクロール位置を復元するためListView.setSelectionFromTop()に、必要な項目のインデックスと、 の上端から上端を配置するためのオフセットを指定して呼び出しますListView

于 2016-09-30T13:44:13.530 に答える
1

Chris Banes による優れた記事があります。最初の部分では、 を同じ表示位置ListView#setSelectionFromTop(int)に保つために使用します。ListViewちらつきを防ぐためListViewの解決策は、ListView が子のレイアウトを単純にブロックすることです。

于 2013-10-04T16:24:26.760 に答える