并排两个ListViews并排Android

时间:2013-02-27 00:24:52

标签: java android android-listview scroll motionevent

我正在努力使两个并排的ListViews在某种程度上像GridView一样。我没有使用GridView的原因是因为不支持Staggered Look。无论如何,到目前为止我有以下代码:

< - 旧的,现在不相关的代码 - >

编辑:

我在@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) {
            }
        });

我也在其中一个列表上使用标题来创建交错效果,我需要不惜一切代价保持这种交错。这主要是工作(上面的代码),但它很多时候都是unyncs。我已经发现这只是在我进行短暂的轻扫时。我不知道为什么,我找不到一个好的解决方案。在我看来,上述逻辑应该有效。

另外,万一重要,我使用UniversalImageLoader加载照片和一个简单的EndlessScroll逻辑来加载更多照片(直接调用adapter.notifyDataSetChanged())。这个东西虽然看起来不太相关。即使照片被加载,我仍然可以看到它取消。

我想明确一点:如果我做短暂的滑动(有时只是一般的重复滚动),我可以随意取消同步。

感谢任何帮助。感谢。

编辑2:

然而要找到一个好的解决方案。以下是我发现的解决方案不太有效:

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

好的,所以我最终使用Linear Layout Method(参见问题)并使用setTag来使onItemClickListener正常工作,并使用CustomScrollView实现来使无限List工作。

基本上,两个linearLayouts水平堆叠,在滚动视图内。它工作得很好,加载速度更快。

此外,如果有帮助,请加载我的图片SmartImageView

如果有人想要这些代码,我可能会发布部分内容。

答案 1 :(得分:1)

而不是在监听onTouch,为什么不在ListViews的onScroll侦听器中滚动列表。这就是我在那个库中使用的类似跟踪ListView的滚动类似的东西,它就像一个魅力。看看这个文件。 https://github.com/JlUgia/list_moving_container/blob/master/src/com/ugia/listmovingcontainer/fragment/BottomListMovingContainerFragment.java

特别注意81(不要忘记添加全局布局更新程序监听器)和89(使用onScroll Listener)。 这样你就可以忘记点击黑客了。

更新

我会按照以下方式编写代码。

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已使列表无效。

**请注意,我没有测试代码。虽然它应该足够简单。