powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Прокрутка списка
5 сообщений из 5, страница 1 из 1
Прокрутка списка
    #39077318
Витяй1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Пытаюсь реализовать прокрутку listview, при прокрутке горизонтальной панели с датами. Выглядеть должно так:

пользователь прокручивает панель с датами и подтаскивается наверх та часть списка, которая этой дате соответствует, а также если пользователь пролистывает список, то прокручивается верхняя панель в соответсвии с датой в списке.

Пытался использовать PagerTabStrip, но там без смены фрагмента не обойтись, а как еще можно сделать или, может, есть библиотека уже готовая для реализации такой логики?
...
Рейтинг: 0 / 0
Прокрутка списка
    #39077331
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы сделал два RecyclerView.
Один горизонтальный, другой вертикальный.
...
Рейтинг: 0 / 0
Прокрутка списка
    #39078854
Витяй1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, спасибо, я сейчас попробовал так сделать, при добавлении обработчика прокручивания для одного списка, все нормально работает, но когда я добавил обработчик для второго, то поймал исключение

exception10-16 18:49:51.306 13117-13117/com.project.testrecyclerview E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.StackOverflowError
at android.support.v7.widget.ChildHelper$Bucket.countOnesBefore(ChildHelper.java:478)
at android.support.v7.widget.ChildHelper.getOffset(ChildHelper.java:120)
at android.support.v7.widget.ChildHelper.getChildAt(ChildHelper.java:180)
at android.support.v7.widget.RecyclerView$LayoutManager.getChildAt(RecyclerView.java:6614)
at android.support.v7.widget.LinearLayoutManager.recycleViewsFromStart(LinearLayoutManager.java:1238)
at android.support.v7.widget.LinearLayoutManager.recycleByLayoutState(LinearLayoutManager.java:1304)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1328)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1162)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1019)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1399)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$1.onScrolled(MainActivity.java:75)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$2.onScrolled(MainActivity.java:88)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$1.onScrolled(MainActivity.java:75)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$2.onScrolled(MainActivity.java:88)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$1.onScrolled(MainActivity.java:75)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$2.onScrolled(MainActivity.java:88)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$1.onScrolled(MainActivity.java:75)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$2.onScrolled(MainActivity.java:88)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.MainActivity$1.onScrolled(MainActivity.java:75)
at android.support.v7.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:3805)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1447)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1358)
at com.lastdayofhell.testrecyclerview.Mai


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.poliveira.parallaxrecyclerview.ParallaxRecyclerAdapter;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends FragmentActivity {

    private RecyclerView rvVertical;
    private RecyclerView rvHorizontal;

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

        rvVertical = (RecyclerView)findViewById(R.id.rvVertical);
        rvHorizontal = (RecyclerView)findViewById(R.id.rvHorizontal);

        ArrayList<HorizontalListModel> horizontalList = new ArrayList<HorizontalListModel>();
        ArrayList<VerticalListModel> verticalList = new ArrayList<VerticalListModel>();

        HorizontalListModel hModel;
        VerticalListModel vModel;

        for(int i = 0; i < 100; i ++){
            hModel = new HorizontalListModel();
            hModel.setDate(i);
            hModel.setUnion_tag(i);
            horizontalList.add(hModel);

            vModel = new VerticalListModel();
            vModel.setTitle("item " + i);
            vModel.setUnion_tag(i);
            verticalList.add(vModel);
        }

        MyHorizontalAdapter horizontalAdapter = new MyHorizontalAdapter(this, horizontalList);
        MyVerticalAdapter verticalAdapter = new MyVerticalAdapter(this, verticalList);

        LinearLayoutManager layoutManagerHorizontal = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        LinearLayoutManager layoutManagerVertical = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

        rvVertical.setLayoutManager(layoutManagerVertical);
        rvHorizontal.setLayoutManager(layoutManagerHorizontal);

        rvVertical.setAdapter(verticalAdapter);
        rvHorizontal.setAdapter(horizontalAdapter);

        int width = getWindowManager().getDefaultDisplay().getWidth();
        int height = getWindowManager().getDefaultDisplay().getHeight();

        Log.e("screen size: ", "height: " + height + " width: " + width);

        rvHorizontal.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                rvVertical.scrollBy(dy, dx);
            }
        });

        rvVertical.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                rvHorizontal.scrollBy(dy, dx);
            }
        });

    }

    class MyHorizontalAdapter extends ParallaxRecyclerAdapter<HorizontalListModel> {
        Activity activity;
        List<HorizontalListModel> list;

        public MyHorizontalAdapter(Activity activity, List<HorizontalListModel> list){
            super(list);
            this.list = list;
            this.activity = activity;
        }

        @Override
        public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter<HorizontalListModel> adapter, int i) {
            ((ViewHolder) viewHolder).day.setText(String.valueOf(list.get(i).getDate()));
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, ParallaxRecyclerAdapter<HorizontalListModel> adapter, int i) {
            return new ViewHolder(activity.getLayoutInflater().inflate(R.layout.horizontal, viewGroup, false));
        }

        @Override
        public int getItemCountImpl(ParallaxRecyclerAdapter<HorizontalListModel> adapter) {
            return list.size();
        }

        class ViewHolder extends RecyclerView.ViewHolder{
            private TextView day;
            public ViewHolder(View holderView) {
                super(holderView);
                day = (TextView) holderView.findViewById(R.id.day);
            }
        }
    }

    class MyVerticalAdapter extends ParallaxRecyclerAdapter<VerticalListModel> {
        Activity activity;
        List<VerticalListModel> list;

        public MyVerticalAdapter(Activity activity, List<VerticalListModel> list){
            super(list);
            this.list = list;
            this.activity = activity;
        }

        @Override
        public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter<VerticalListModel> adapter, int i) {
            ((ViewHolder) viewHolder).text.setText(list.get(i).getTitle());
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, ParallaxRecyclerAdapter<VerticalListModel> adapter, int i) {
            return new ViewHolder(activity.getLayoutInflater().inflate(R.layout.vertical, viewGroup, false));
        }

        @Override
        public int getItemCountImpl(ParallaxRecyclerAdapter<VerticalListModel> adapter) {
            return list.size();
        }

        class ViewHolder extends RecyclerView.ViewHolder{
            private TextView text;
            public ViewHolder(View holderView) {
                super(holderView);
                text = (TextView) holderView.findViewById(R.id.text);
            }
        }
    }
}


т.е., как я понял два списка бесконечно вызывают кручение друг у друга в методах(
...
Рейтинг: 0 / 0
Прокрутка списка
    #39078880
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Витяй1991,

тут придется думать, чтоб избежать переполнения стека. :)
...
Рейтинг: 0 / 0
Прокрутка списка
    #39078894
Витяй1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
сделал так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
private static boolean onScrollVertical = true;
private static boolean onScrollHorizontal = true;

  rvHorizontal.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if(onScrollVertical){
                    onScrollHorizontal = false;
                    rvVertical.scrollBy(dy, dx);
                    onScrollHorizontal = true;
                }
            }
        });


        rvVertical.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if(onScrollHorizontal){
                    onScrollVertical = false;
                    rvHorizontal.scrollBy(dy, dx);
                    onScrollVertical = true;
                }
            }
        });



ничего лучше не придумал, но работает, не вылетает
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Прокрутка списка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]