6

私のアプリケーションでは、テーブル内の行のようにリンクされたカスタム ListView をそれぞれ持つ ViewPager があります。問題は、最初のページで ListView をスクロールしてから ViewPager をスクロールすると、最初のページの ListView と 2 番目のページの ListView がずれることです。最初のリストビューには説明付きの TextView があり、次にデータ付きの 4 つの列があり、次のリストビューには説明のない 6 つの列があるため、それらがずれていると非常に複雑になるため、リストビューを整列する必要があります。では、すべてのlistViewを一度にスクロールするにはどうすればよいですか??

編集:

Rahul Parsani に感謝します...私は最終的にこれを行う方法を管理しました...別のフラグメントに listView があり、フラグメントの数が定義されていない場合、これが答えです:

final ArrayList<ListView> lvs = new ArrayList<ListView>();
        for (int j = 0; j < adapter.getCount(); j++) {
            YourFragment fragJ = (YourFragment) adapter.getItem(j);
            final ListView listViewJ = fragJ.lv;
            lvs.add(listViewJ);
        }

        for (int j = 0; j < lvs.size(); j++) {
            final int x = j;
            lvs.get(j).setOnTouchListener(new OnTouchListener() {

                boolean dispatched = false;
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (!dispatched) {
                        dispatched = true;
                        if (x != 0) {
                            lvs.get(x - 1).dispatchTouchEvent(event);
                        };
                        if (x != lvs.size() - 1) {
                            lvs.get(x + 1).dispatchTouchEvent(event);
                        }

                    }
                    dispatched = false;
                    return false;
                }
            });
        }
4

3 に答える 3

5

あなたがやろうとしているのは、リストビューを同期することです。2 つのリストビューでこれを既に実装しているライブラリがここにあります。私はあなたに関連するソースコードの部分を説明しようとします.

変数を介してすべてのリストビューにアクセスできるとします。

listViewOne = (ListView) findViewById(R.id.list_view_one);
listViewTwo = (ListView) findViewById(R.id.list_view_two);
listViewThree = (ListView) findViewById(R.id.list_view_three);
listViewFour = (ListView) findViewById(R.id.list_view_four);

それらに同じタッチ リスナーを設定します。

listViewOne.setOnTouchListener(touchListener);
listViewTwo.setOnTouchListener(touchListener);
// similarly for listViewThree & listViewFour

タッチ リスナーの基本的な考え方は、イベントを他のビューにディスパッチして、タッチされたリストビューと同期してスクロールできるようにすることです。

// Passing the touch event to the opposite list
OnTouchListener touchListener = new OnTouchListener() {                                        
    boolean dispatched = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.equals(listViewOne) && !dispatched) {
            dispatched = true;
            listViewTwo.dispatchTouchEvent(event);
            listViewThree.dispatchTouchEvent(event);
            listViewFour.dispatchTouchEvent(event);
        } else if (v.equals(listViewTwo) && !dispatched) {
            dispatched = true;
            listViewOne.dispatchTouchEvent(event);
            listViewThree.dispatchTouchEvent(event);
            listViewFour.dispatchTouchEvent(event);
         } // similarly for listViewThree & listViewFour 
         dispatched = false;
         return false;
    }
};

ライブラリにはスクロールリスナーも設定されています。これは、ビューの高さが異なる可能性があるため、使用されていると思われます。これがうまくいくかどうか教えてください。

于 2013-11-14T04:06:45.637 に答える
-1

リストビュー項目の高さは同じですか? もしそうなら、一番上の可視要素の位置を他のリストビューアダプターに渡すことができます。

 int curTop=listview.getFirstVisiblePosition();

 listview2.setSelection(curTop);
于 2013-11-18T10:28:07.917 に答える