2013-02-27 66 views
7

我想让两个并排的ListViews在一定程度上像GridView一样工作。我没有使用GridView的原因是因为没有支持Staggered Look。不管怎么说,我有以下的代码至今:并行同步两个ListViews Android

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

编辑:

我一样@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:

还没有找到一个好的解决办法。下面是我发现不太工作的解决方案:

有什么想法?谢谢。

+0

显然Pinterest使用这样的布局,如果您在[“android pinterest”](http://stackoverflow.com/search?q= [android] + pinterest)中搜索Stack Overflow,可以找到各种方法。 – Sam 2013-02-27 00:29:26

+0

是的,我意识到这一点。我也一直在研究这个。实际上,我从Pinterest样式网格的另一个答案中获得了部分源代码,https://github.com/vladexologija/PinterestListView,但我不认为它解决了区分onItemClicks和TouchEvents与滚动相关的问题。 – Kgrover 2013-02-27 00:32:19

+1

我从未使用Pinterest应用,但当有人问:[Android。一起滚动2个列表视图](http://stackoverflow.com/q/12342419/1267661)我想出了一个可以帮助你的解决方案。 (它可以像你想要的那样处理点击,但有时同步会打破......) – Sam 2013-02-27 00:41:06

回答

2

好吧,所以我结束了使用Linear Layout Method(请参阅问题)并使用setTag获取onItemClickListener的工作方式,并使用CustomScrollView实现无限List工作。

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

此外,要加载我的图像SmartImageView如果有帮助。

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

+0

不错!很高兴听到 – 2013-04-08 08:52:20

1

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

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

UPDATE

我会按照以下方式对其进行编码。

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已使您的列表失效。

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

+0

我会试试看。你能给我更多关于如何在我目前的系统中实现这一点的反馈吗?我很难解码代码中究竟发生了什么,以及如何使用它来完成并行列表。谢谢你的答案,但这是一个挑战。 – Kgrover 2013-04-01 22:52:31

+0

另外 - 你的代码到底做了什么?它是否以平行方式滚动_2_列表? – Kgrover 2013-04-01 22:53:22

+0

否,它基于依赖于列表的滚动位置的函数滚动视图(列表的页脚)。 为你的情况,我会实现两个监听器(globalLayoutListener和onScrollListener)为你的两个listViews更新其中每个列表中的其他列表。让我用一个例子来更新我的答案。 – 2013-04-02 07:30:56