7

2つ並べたListViewをある程度GridViewのように動作させようとしています。GridViewを使用しない理由は、スタッガードルックがサポートされていないためです。とにかく、私はこれまでに次のコードを持っています:

<-古い、今は無関係なコード->

編集:

@Samが提案したように、次のコードを使用しました。

lv1.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (touchSource == null) {
                    touchSource = v;
                }

                if (v == touchSource) {
                    lv2.dispatchTouchEvent(event);
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        clickSource = v;
                        touchSource = null;
                    }
                }

                return false;
            }
        });

        lv1.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if (parent == clickSource) {
                               //my own code here

                }
            }
        });

        lv1.setOnScrollListener(new OnScrollListener() {
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if (view == clickSource) {


                }
                boolean loadMore = /* maybe add a padding */
                firstVisibleItem + visibleItemCount + 10 >= totalItemCount;

                if (loadMore) {
                    //add items, load more
                }
            }

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
        });

        lv2.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (touchSource == null) {
                    touchSource = v;
                }

                if (v == touchSource) {
                    lv1.dispatchTouchEvent(event);
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        clickSource = v;
                        touchSource = null;
                    }
                }

                return false;
            }
        });
        lv2.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if (parent == clickSource) {
                }
            }
        });

        lv2.setOnScrollListener(new OnScrollListener() {
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if (view == clickSource) {

                }
                boolean loadMore = /* maybe add a padding */
                firstVisibleItem + visibleItemCount + 2 >= totalItemCount;

                if (loadMore) {

                }

            }

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
        });

また、リストの1つでヘッダーを使用してスタッガード効果を作成しているので、このスタガーを維持する必要があります。これはほとんど機能しています(上記のコード)が、多くの場合非同期になります。これは、小さな短いスワイプがある場合にのみ発生することがわかりました。理由はわかりませんが、良い解決策を見つけることができません。上記のロジックが機能するはずだと私には思えます。

また、念のため、UniversalImageLoaderを使用して写真をロードし、単純なEndlessScrollロジックを使用してさらに写真をロードしています(adapter.notifyDataSetChanged()を直接呼び出しています)。しかし、このようなものはあまり関連性がないようです。写真が読み込まれていても、同期がとれていないことがわかります。

明確にしておきたいのですが、短いスワイプ(場合によっては一般的に繰り返しスクロール)を行うと、リストの同期を自由に解除できます。

どんな助けでも大歓迎です。ありがとう。

編集2:

まだ良い解決策を見つけるために。うまく機能しないことがわかった解決策は次のとおりです。

何か案は?ありがとう。

4

2 に答える 2

2

さて、Linear Layout Method(質問を参照)を使用し、setTagを使用してonItemClickListenerを機能させ、CustomScrollView実装を使用して無限リストを機能させました。

基本的に、スクロールビュー内で水平に積み重ねられた 2 つの linearLayouts。それはかなりうまく機能し、はるかに高速にロードされます。

また、それが助けになった場合は、私の画像SmartImageViewをロードします。

誰かがコードを欲しがっていれば、その一部を投稿できるかもしれません。

于 2013-04-08T04:11:24.033 に答える
1

onTouch を聞く代わりに、ListViews の onScroll リスナーでリストをスクロールしてみませんか。それは私がそのライブラリで使用しているもので、ListViewのスクロールを同様に追跡し、魅力的に機能します。このファイルをチェックしてください。https://github.com/JlUgia/list_moving_container/blob/master/src/com/ugia/listmovingcontainer/fragment/BottomListMovingContainerFragment.java

特に 81 (グローバル レイアウト アップデータ リスナーを追加することを忘れないでください) と 89 (onScroll リスナーを使用) に注意してください。そうすれば、クリックハックも忘れることができます.

アップデート

次のようにコーディングします。

lv1.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        updateListPosition(lv2, lv1);
    }
});

lv1.setOnScrollListener(new AbsListView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        updateListPosition(lv2, lv1);
    }
});

lv2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        updateListPosition(lv1, lv2);
    }
});

lv2.setOnScrollListener(new AbsListView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        updateListPosition(lv1, lv2);
    }
});

private void updateListPosition(ListView updatedList, ListView scrolledList){
    updatedList.setScrollY(scrolledList.getScrollY());

}

** setScrollY はすでにリストを無効にしています。

** コードをテストしていないことに注意してください。それは十分に単純であるべきですが。

于 2013-04-01T21:15:31.223 に答える