2013-02-27 3 views
7

Я пытаюсь сделать два бок о бок ListViews, как часть GridView. Причина, по которой я не использую GridView, заключается в том, что поддержка Staggered Look не поддерживается. В любом случае, у меня есть следующий код до сих пор:Синхронизация двух ListViews рядом с Android.

< - Старый, то теперь ненужный код ->

EDIT:

Я сделал так, как предложил и @ Сэм использовал следующий код:

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 для загрузки большего количества фотографий (напрямую вызываю адаптер.notifyDataSetChanged()). Однако этот материал не слишком уместен. Даже когда фотографии загружаются, я все еще вижу, что это несинхронизирует.

Я хочу быть ясным: если я делаю короткие звуки (а иногда и просто повторяющиеся прокрутки), я могу несинхронизировать списки по своему желанию.

Любая помощь приветствуется. Благодарю.

EDIT 2:

Тем не менее, чтобы найти хорошее решение. Вот те решения, которые я обнаружил, что не совсем работа:

Любые идеи? Благодарю.

+0

По-видимому, Pinterest использует макет, подобный этому, вы можете найти различные подходы, если вы ищете здесь в Stack Overflow для ["android pinterest"] (http://stackoverflow.com/search?q= [android] + pinterest). – Sam

+0

Да, я это понимаю. Я тоже много разбираюсь в этом. Я действительно получил часть этого источника из другого ответа на сетки стиля Pinterest, https://github.com/vladexologija/PinterestListView, но я не думаю, что он решает мою проблему дифференцирования onItemClicks и TouchEvents, имеющих отношение к прокрутке. – Kgrover

+1

Я никогда не использовал приложение Pinterest, но когда кто-то спросил: [Android. Прокрутка 2 списка вместе] (http://stackoverflow.com/q/12342419/1267661) Я придумал решение, которое может вам помочь. (Он обрабатывает клики, как вы хотите, но иногда синхронизация прерывается ...) – Sam

ответ

2

Хорошо, поэтому я закончил использование Linear Layout Method (см. Вопрос) и использовал setTag для работы onItemClickListener и реализацию CustomScrollView, чтобы получить бесконечный список.

В принципе, два линейных лотка уложены горизонтально, внутри прокрутки. Он работает довольно хорошо и загружается намного быстрее.

Кроме того, чтобы загрузить мои изображения SmartImageView, если это поможет.

Если кому-то нужен код, я мог бы разместить его в нем.

+0

Ницца! Рад это слышать –

1

Вместо того, чтобы слушать onTouch, почему бы вам не прокручивать списки в прослушивателе onScroll ListViews. Это то, что я использую в этой библиотеке со списками прокрутки 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

+0

Кроме того, что именно делает ваш код? Прокручивает ли он _2_ списки параллельно? – Kgrover

+0

Нет прокрутки представления (нижний колонтитул списка) на основе функции, зависящей от положения прокрутки списка. Для вашего случая я бы использовал как listener (globalLayoutListener, так и onScrollListener) для обоих ваших списков, обновляющих другой список в каждом из них. Позвольте мне обновить свой ответ на примере. –