【问题标题】:Syncing Two ListViews side by side Android并排同步两个 ListViews Android
【发布时间】:2013-04-08 12:11:24
【问题描述】:

我试图让两个并排的 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) {
            }
        });

我还在其中一个列表上使用 标题 来创建交错效果,我需要不惜一切代价保持这种交错。这主要是有效的(上面的代码),但它很多时候不同步。我发现这只是当我有小的短刷时。我不知道为什么,我找不到一个好的解决方案。在我看来,上述逻辑应该可行。

另外,为了以防万一,我使用 UniversalImageLoader 加载照片和一个简单的 EndlessScroll 逻辑来加载更多照片(直接调用 adapter.notifyDataSetChanged())。不过,这东西似乎不太相关。即使加载了照片,我仍然可以看到它不同步。

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

感谢任何帮助。谢谢。

编辑 2:

还没有找到好的解决方案。以下是我发现不太奏效的解决方案:

有什么想法吗?谢谢。

【问题讨论】:

  • 显然 Pinterest 使用了这样的布局,如果您在 Stack Overflow 上搜索 "android pinterest",您可以找到各种方法。
  • 是的,我意识到这一点。我也一直在研究这个。实际上,我从 Pinterest 样式网格的另一个答案github.com/vladexologija/PinterestListView 中获得了部分来源,但我认为它不能解决我区分与滚动相关的 onItemClicks 和 TouchEvents 的问题。
  • 我从未使用过 Pinterest 应用程序,但当有人问:Android. Scrolling 2 listviews together 我想出了一个可能对您有所帮助的解决方案。 (它可以处理您想要的点击,但有时同步会中断......)
  • StaggeredGridView 具有良好的点击处理能力,看起来很符合您的要求。
  • 我不能用这个实现滚动监听。感谢您的建议。

标签: java android android-listview scroll motionevent


【解决方案1】:

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

基本上,两个线性布局水平堆叠在一个滚动视图内。它运行良好,加载速度更快。

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

如果有人想要代码,我可以发布其中的一部分。

【讨论】:

    【解决方案2】:

    你为什么不在 ListViews 的 onScroll 监听器中滚动列表,而不是监听 onTouch。这就是我在那个库中使用的类似跟踪 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 已经使您的列表无效。

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

    【讨论】:

    • 我会试试的。您能否就如何在我当前的系统中实现这一点提供更多反馈?我很难解码您的代码中到底发生了什么以及如何使用它来完成并行列表。不过谢谢你的回答,这个是一个笨蛋。
    • 另外,你的代码到底是做什么的?它是否以并行方式滚动 2 个列表?
    • 不,它基于依赖于列表滚动位置的函数滚动视图(列表的页脚)。对于您的情况,我将为您的两个 listView 实现两个侦听器(globalLayoutListener 和 onScrollListener),并更新每个列表中的另一个列表。让我用一个例子来更新我的答案。
    • 那么缺少什么?结果是什么?什么都不动?
    • 是的,我似乎无法让它们与此平行-它会移动,但非常不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多