2013-02-27 59 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