2015-06-11 4 views
0

Вот моя текущая конфигурация макета:Синхронизировать два ListViews друг на друга в FrameLayout

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ListView 
     android:id="@+id/list_1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:cacheColorHint="@android:color/transparent" 
     android:drawSelectorOnTop="false" 
     android:dividerHeight="0dp" 
     android:divider="@null" 
     android:scrollbars="none" /> 

    <ListView 
     android:id="@+id/list_2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:cacheColorHint="@android:color/transparent" 
     android:drawSelectorOnTop="false" 
     android:dividerHeight="0dp" 
     android:divider="@null" 
     android:scrollbars="none" /> 

</FrameLayout> 

Верхняя ListView в основном скроллинг наложения для базового ListView: list_1, они должны иметь одинаковую высоту. Оверлей не отображается на холостом ходу, но при перетаскивании он имеет некоторую альфу и отображает текущий раздел list_1.

Я сделал это так, что у нас есть список 1, а список 2 имеют одинаковую высоту содержимого, но у них есть РАЗЛИЧНАЯ ПЛАН для собственного списка.

Зная, что list_2 здесь поймает события касания здесь, я хочу синхронизировать смещение прокрутки списка. Я отчасти это удалось в этом примере:

mListView2.setOnScrollListener(new AbsListView.OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(AbsListView view, int scrollState) { 

       } 

       @Override 
       public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
        View c = mListViewMonths.getChildAt(0); 
        int scrolly = -c.getTop() + mListViewMonths.getFirstVisiblePosition() * c.getHeight(); 
        mListViewWeeks.setScrollY(scrolly); 
       } 
      }); 

В исключением того, что ListView1 получает прокручивается, но при переходе вниз нет элементов списка из ListView1 не рисуются. Что мне здесь не хватает?

Или, может быть, лучше, отправьте событие касания в listview, а не на все эти методы прокрутки. Мысли?

+0

У меня есть возможное решение, которое я использую, чтобы иметь два списка в представлении сохранения. Решение включает использование scrollview. Я отправлю его в качестве ответа. –

+0

Я не знаю, что вы пытаетесь сделать, но я бы, вероятно, искал другое решение. Это звучит в лучшем случае хакерским. Например, вы можете использовать framelayout как свой элемент, с вашими различными макетами в нем. – njzk2

+0

Хм, глядя на комментарии, которые я получил, я должен, вероятно, возглавить в другом направлении, я предполагаю, что нужно использовать только один список, слишком хакерский, это правда. Но эффект, который я хочу реализовать, требует некоторой работы. Спасибо за ввод. –

ответ

0

я, наконец, удалось осуществить это с помощью этого вспомогательный класс здесь:

Helper class for calculating relative scroll offsets in a ListView

Затем в list2 прокрутки слушателю просто сделать:

@Override 
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    int incrementalOffset = mScrollTracker.calculateIncrementalOffset(firstVisibleItem, visibleItemCount); 
    mListView2.scrollListBy(-incrementalOffset); 
} 

Вот и все!

0

Это немного взломанный, но должен работать.

activity_main_activity_list.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.android.recyclerview.MainActivityList"> 

    <ScrollView 
     android:id="@+id/scroll2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <ListView 
       android:id="@+id/list_2" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="1" 
       android:cacheColorHint="@android:color/transparent" 
       android:divider="@null" 
       android:dividerHeight="0dp" 
       android:drawSelectorOnTop="false" 
       android:scrollbars="none"/> 
     </LinearLayout> 
    </ScrollView> 


    <ScrollView 
     android:id="@+id/scroll1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <ListView 
       android:id="@+id/list_1" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="1" 
       android:cacheColorHint="@android:color/transparent" 
       android:divider="@null" 
       android:dividerHeight="0dp" 
       android:drawSelectorOnTop="false" 
       android:scrollbars="none"/> 

     </LinearLayout> 
    </ScrollView> 
</RelativeLayout> 

MainActivityList

public class MainActivityList extends Activity { 

    ScrollView scroll1, scroll2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_activity_list); 

     ListView list_1 = (ListView) findViewById(R.id.list_1); 
     // Set list_1 Adapter 
     SetListOneHeight.setListViewHeight(list_1); 

     ListView list_2 = (ListView) findViewById(R.id.list_2); 
     // Set list_2 Adapter 
     SetListTwoHeight.setListViewHeight(list_2); 

     scroll1 = (ScrollView) findViewById(R.id.scroll1); 
     scroll2 = (ScrollView) findViewById(R.id.scroll2); 

     scroll1.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
      @Override 
      public void onScrollChanged() { 
       int scrollY = scroll1.getScrollY(); 
       scroll2.scrollTo(0, scrollY); 
      } 
     }); 
    } 
} 

Создание двух Seperate классов Java

SetListOneHeight

public class SetListOneHeight { 
    public static void setListViewHeight(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(0, 0); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 
} 

SetListTwoHeight

public class SetListTwoHeight { 
    public static void setListViewHeight(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(0, 0); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 
} 
+0

Спасибо! Увидев Linearlayout, вы говорите здесь о двух последовательных списках по вертикали или двух списках друг на друга? –

+0

@ Tíbó Они будут вертикально внутри LinearLayout.list_1 поверх списка_2. Это то, что вы хотите сделать? –

+0

О, извините! Наверху, я имею в виду на основе z. Одно из списков при z = 0 и другое в z = 1. Извиняюсь за неправильное формулирование моего вопроса! –