8

明らかにスクロール可能なリストビューがあります。リストビューには、いくつかのフォームの質問が含まれています。ユーザーがフォームを送信すると、リストビューの上にスタンプのようなカスタムビューが配置されます(ユーザーが質問に回答できないようにしますが、ここでは問題になりません)。

スタンプは(画面の上部のように)リストビューの上部に表示され、リストビューと同じ速度でスクロール可能である必要があります。つまり、最初にその下にあったリ​​ストビューのアイテムが画面の上部に表示されなくなったときに消えます。スクロールしました。

これを達成する方法はありますか?

4

2 に答える 2

6

私は解決策を見つけました。エレガントすぎるかどうかはわかりませんが、うまくいくので、誰かがもっと良いものを考え出さない限り、そのままにしておきます。

リストと一緒にスクロールしたいビューはカスタムビューであり、リストビューについて知っている必要があります。そこで、setListView(ListView listView)メソッドを実装します。

private int scrollY; //1
private Map<Integer, Integer> listViewItemHeights = new Hashtable<>();
public void setListView(final ListView listView) {
    listView.setOnScrollListener(new OnScrollListener() {  //2
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {} //3

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4
            View c = listView.getChildAt(0);
            if (c != null) {
                int oldScrollY = scrollY;
                scrollY = -c.getTop();

                listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight());
                for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) {
                    if (listViewItemHeights.get(i) != null)
                        scrollY += listViewItemHeights.get(i);
                }
                scrollBy(0, scrollY - oldScrollY);
            }
        }
    });
}

コメントNo.1:これは現在のスクロール位置を追跡できる変数です。

コメントNo.2:スクロールリスナーを新しく設定して、カスタムビューにリストが表示されたときに通知する

コメントNo.3:この場合、これを実装する必要はありません。

コメントNo.4:ここで魔法が起こります。最後に、scrollY-oldScrollYでビューをスクロールすることに注意してください。最初に、このビットから始めましょう。oldScrollYは保持されたスクロール位置であり、scrollYは新しい位置です。それらの違いでスクロールする必要があります。scrollYの計算方法については、ここで私の答えを参照してください。AndroidはListViewで正確なスクロール位置を取得します。これは、リストビューでのスクロール位置の計算方法です。

于 2012-11-20T17:17:55.240 に答える
5

トップ画面の表示では、headerviewを追加できるので、customレイアウトをlistviewのheaderlayoutとしてバインドします。listviewと同じスクロールができます。

View headerview = ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.track_footer_view, null, false);
    listview.addHeaderView(headerview);
于 2012-10-30T12:20:40.000 に答える