Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128

Обработка нажатий на элементах списка Recycleview

30.09.2018, 11:41. Показов 1686. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Впервые пытаюсь создать список с возможностью нажатия на элементах списка. При нажатии на элементы происходят переходы в другие фрагменты.

Код фрагмента, где реализую Recycleview и холдер
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
public class MainMenuFragment extends android.support.v4.app.Fragment {
 
    public RecyclerView mRecyclerView;
    public MainMenuAdapter menuAdapter;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        View v = inflater.inflate(R.layout.fragment_main_menu_fragment, container, false);
 
        mRecyclerView = (RecyclerView) v.findViewById(R.id.main_menu_fragment);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            mRecyclerView.setLayoutManager(new GridLayoutManager(this.getContext(), 2));
        }
 
        final MainActivity currentActivity = (MainActivity) getActivity();
 
        OptionElementList optionElementList = new OptionElementList(getActivity());
        List<OptionElement> optionElement = optionElementList.getOptionElement();
 
        MainMenuAdapter.OnUserClickListener mOnUserClickListener = new MainMenuAdapter.OnUserClickListener() {
            @Override
            public void onUserClick(OptionElement optionElement) {
 
 
                if (optionElement.getTitle().equals("Значение 2")) {
                    currentActivity.ShowListOfDirectionsFragment();
                }
            }
        };
 
        MainMenuAdapter mMainMenuAdapter = new MainMenuAdapter(mOnUserClickListener);
        mRecyclerView.setAdapter(mMainMenuAdapter);
 
        menuAdapter = new MainMenuAdapter(optionElement);
        mRecyclerView.setAdapter(menuAdapter);
 
 
        return v;
    }
 
 
    public static class MainMenuHolder extends RecyclerView.ViewHolder {
 
        TextView TitleOfMenuPoint;
        OptionElementList mOptionElementList;
 
 
        public MainMenuHolder(View itemView) {
            super(itemView);
 
            TitleOfMenuPoint = (TextView) itemView.findViewById(R.id.title_of_main_menu_point);
 
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
 
                    List<OptionElement> optionElement = mOptionElementList.get(getLayoutPosition());
                    MainMenuAdapter.OnUserClickListener.onUserClick(optionElement);
                }
            });
        }
    }
 
 
    public class OptionElement {
        String title;
 
        OptionElement(String title) {
            this.title = title;
        }
 
        public String getTitle() {
            return title;
        }
 
    }
 
    public class OptionElementList {
 
        private List<OptionElement> mOptionElements;
 
        private OptionElementList(Context context) {
            mOptionElements = new ArrayList<>();
        }
 
        public List<OptionElement> getOptionElement() {
 
            for (int i = 0; i < 100; i++) {
 
                mOptionElements.add(new OptionElement("Значение 1"));
                mOptionElements.add(new OptionElement("Значение 2"));
                mOptionElements.add(new OptionElement("Значение 3"));
                mOptionElements.add(new OptionElement("Значение 4"));
                mOptionElements.add(new OptionElement("Значение 5"));
                mOptionElements.add(new OptionElement("Значение 6"));
            }
 
            return mOptionElements;
        }
 
        public List<OptionElement> get(int layoutPosition) {
            return null;
        }
    }
 
}
Код адаптера
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
public class MainMenuAdapter extends RecyclerView.Adapter<MainMenuFragment.MainMenuHolder> {
 
    OnUserClickListener mOnUserClickListener;
 
    public MainMenuAdapter(OnUserClickListener mOnUserClickListener) {
        this.mOnUserClickListener=mOnUserClickListener;
    }
 
    public interface OnUserClickListener {
        void onUserClick(MainMenuFragment.OptionElement optionElement);
    }
 
    List<MainMenuFragment.OptionElement> mOptionElement;
 
    public MainMenuAdapter(List<MainMenuFragment.OptionElement> optionElements) {
        mOptionElement = optionElements;
    }
 
    public MainMenuFragment.MainMenuHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.menu_point, parent, false);
 
        GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
        params.height = 350;
        params.width = 350;
        params.getSpanSize();
 
        view.setLayoutParams(params);
 
 
        return new MainMenuFragment.MainMenuHolder(view);
    }
 
    public void onBindViewHolder(MainMenuFragment.MainMenuHolder menuHolder, int position) {
        menuHolder.TitleOfMenuPoint.setText((mOptionElement.get(position)).getTitle());
 
        Log.d("Testing", "Checkpoint 1");
    }
 
    public int getItemCount() {
 
        return  mOptionElement == null ? 0 : mOptionElement.size();
    }
}
Проблема в том, что в холдере подчеркивает onUserClick в строке MainMenuAdapter.OnUserClickListener.onUs erClick(optionElement) и пишет, что не может реализовать нестатический метод в статическом контексте. Я это понимаю, но не понимаю, как изменить код, чтобы работало...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2018, 11:41
Ответы с готовыми решениями:

Обработка клика на нескольких элементах
Здравствуйте. Подскажите, пожалуйста, как обработать более красиво клик на нескольких элементах меню? То есть у меня меню с...

Поиск дубликатов в элементах списка
Уважаемые форумчане, подскажите, почему этот код работает отлично procedure TForm1.BtnDoubleUrlClick(Sender: TObject); // Поиск...

Обработка нажатий
Господа подскажите как определить что пользователь провел пальцем влево или в право? Отслеживать в onTouch координаты? Если Х...

13
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
30.09.2018, 17:04
Каша какая-то. Кладёшь холдер в файл адаптера, в этом холдере или в onBindViewHolder добавляешь mOnUserClickListener в setOnClickListener какой-нибудь вьюхи, а во фрагменте имплементишь интерфейс и вписываешь в метод нужный код.
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
30.09.2018, 22:34  [ТС]
ExFau$t, попробовал так
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
public class MainMenuFragment extends android.support.v4.app.Fragment {
 
    public RecyclerView mRecyclerView;
    public MainMenuAdapter menuAdapter;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        View v = inflater.inflate(R.layout.fragment_main_menu_fragment, container, false);
 
        mRecyclerView = (RecyclerView) v.findViewById(R.id.main_menu_fragment);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            mRecyclerView.setLayoutManager(new GridLayoutManager(this.getContext(), 2));
        }
 
        final MainActivity currentActivity = (MainActivity) getActivity();
 
        OptionElementList optionElementList = new OptionElementList(getActivity());
        List<OptionElement> optionElement = optionElementList.getOptionElement();
 
        MainMenuAdapter.OnUserClickListener mOnUserClickListener = new MainMenuAdapter.OnUserClickListener() {
            @Override
            public void onUserClick(OptionElement optionElement) {
 
                if (optionElement.getTitle().equals("Направления подготовки")) {
                    currentActivity.ShowListOfDirectionsFragment();
                }
            }
        };
 
        MainMenuAdapter mMainMenuAdapter = new MainMenuAdapter(mOnUserClickListener);
        mRecyclerView.setAdapter(mMainMenuAdapter);
 
        menuAdapter = new MainMenuAdapter(optionElement);
        mRecyclerView.setAdapter(menuAdapter);
 
        return v;
    }
 
 
    public static class MainMenuAdapter extends RecyclerView.Adapter<MainMenuAdapter.MainMenuHolder> {
 
        public interface OnUserClickListener {
            void onUserClick(MainMenuFragment.OptionElement optionElement);
        }
 
        OnUserClickListener mOnUserClickListener;
 
        public MainMenuAdapter(OnUserClickListener mOnUserClickListener) {
            this.mOnUserClickListener = mOnUserClickListener;
        }
 
 
        public class MainMenuHolder extends RecyclerView.ViewHolder {
 
            TextView TitleOfMenuPoint;
 
 
            public MainMenuHolder(View itemView) {
                super(itemView);
 
                TitleOfMenuPoint = (TextView) itemView.findViewById(R.id.title_of_main_menu_point);
 
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnUserClickListener.onUserClick(mOptionElement.get(getLayoutPosition()));
 
                    }
                });
            }
        }
 
 
        List<MainMenuFragment.OptionElement> mOptionElement;
 
        public MainMenuAdapter(List<MainMenuFragment.OptionElement> optionElements) {
            mOptionElement = optionElements;
        }
 
        public MainMenuHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View view = layoutInflater.inflate(R.layout.menu_point, parent, false);
 
            GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
            params.height = 350;
            params.width = 350;
            params.getSpanSize();
 
            view.setLayoutParams(params);
 
 
            return new MainMenuHolder(view);
        }
 
        public void onBindViewHolder(MainMenuHolder menuHolder, int position) {
            menuHolder.TitleOfMenuPoint.setText((mOptionElement.get(position)).getTitle());
 
            Log.d("Testing", "Checkpoint 1");
        }
 
        public int getItemCount() {
 
            return mOptionElement == null ? 0 : mOptionElement.size();
        }
    }
 
 
    public class OptionElement {
        String title;
 
        OptionElement(String title) {
            this.title = title;
        }
 
        public String getTitle() {
            return title;
        }
 
    }
 
    public class OptionElementList {
 
        private List<OptionElement> mOptionElements;
 
        private OptionElementList(Context context) {
            mOptionElements = new ArrayList<>();
        }
 
        public List<OptionElement> getOptionElement() {
 
            for (int i = 0; i < 100; i++) {
 
                mOptionElements.add(new OptionElement("Значение 1"));
                mOptionElements.add(new OptionElement("Значение 2"));
                mOptionElements.add(new OptionElement("Значение 3"));
                mOptionElements.add(new OptionElement("Значение 4"));
                mOptionElements.add(new OptionElement("Значение 5"));
                mOptionElements.add(new OptionElement("Значение 6"));
            }
 
            return mOptionElements;
        }
 
    }
 
}
Собирается. Только при попытке нажать на элемент списка вылетает...
В логе для выражения mOnUserClickListener.onUserClick(mOption Element.get(getLayoutPosition())); пишет NullPointerException. То есть в холдере mOnUserClickListener нулевое значение. Я правильно понимаю, что проблема проистекает из этого участка кода(???):
Java
1
2
3
4
5
6
7
8
9
MainMenuAdapter.OnUserClickListener mOnUserClickListener = new MainMenuAdapter.OnUserClickListener() {
            @Override
            public void onUserClick(OptionElement optionElement) {
 
                if (optionElement.getTitle().equals("Значение 2")) {
                    currentActivity.ShowListOfDirectionsFragment();
                }
            }
        };
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
01.10.2018, 09:19
Цитата Сообщение от Андрей1981 Посмотреть сообщение
проблема проистекает из этого участка кода
Да, его надо удалить. Наверху написать implements MainMenuAdapter.OnUserClickListener, нажать красный фонарик и добавить метод onUserClick.
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
01.10.2018, 23:03  [ТС]
ExFau$t, если я имплементирую MainMenuAdapter.OnUserClickListener студия заставляет сделать так MainMenuFragment.MainMenuAdapter.OnUserC lickListener. То есть получается циклическое наследование - класс наследует сам себя
0
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
02.10.2018, 06:09
Меньше вложенных классов

Класс Адаптера
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
class Adapter {
    List<Model> list;
    Listener listener;
 
    Adapter(List<Model> list, Listener listener) {
         this.list = list;
         this.listener = listener;
    }
    
    View onCreateViewHolder( ... ) { ... }
    void onBindViewHolder( ... ) { ... }
    
    int getCount() {
        return list.size();
    }
 
    interface Listener{
        void itemClick(int position);
    }
 
    class Holder {
        Button button;
        Holder(View itemView) {
            button = (Button)itemView.findViewBindId(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                void onClick(View view) {
                    listener.itemClick(getLayoutPosition());
                }
            );
        }
    }
}

Класс Фрагмента
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fragment {
    List<Model> list = new ArrayList();
 
    View onCreateView(...) {
       return LayoutInflatter.create(...) ...;
    }
 
    void onViewCreated(View view, ...) {
        recyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new ....);
        recyclerView.setAdapter(list, new Adapter.Listener() {
            @Override
            void itemClcik(int position) {
                // тут вся работа с обработкой клика
            }
        });
    }
}
Написал псевдокод, но архитектуру показал

И да, класс модельки лучше вынести тоже в отдельный файл
Java
1
2
3
class Model{
    int value;
}
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
02.10.2018, 11:01
не статик холдер внутри класса адаптера? ну-ну
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
02.10.2018, 19:20  [ТС]
VASSUV, спасибо, попробую - да, переборщил я с вложениями. Отсюда и циклинг
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
05.10.2018, 00:11  [ТС]
Вот код, обрабатывающий нажатия клика в списке.
Только возникла новая проблема

Лог

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.bignerdranch.android.MainActivity.Sh owListOfDirectionsFragment()' on a null object reference at com.bignerdranch.android.MainMenuFragmen t.itemClick(MainMenuFragment.java:

Код активити
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
public class MainActivity extends AppCompatActivity {
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    ShowMenuFragment();
 
}
 
public void ShowMenuFragment() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragmentContainer1);
    if (fragment == null) {
        fragment = new MainMenuFragment();
        fm.beginTransaction()
                .replace(R.id.fragmentContainer1, fragment)
                .commit();
 
    }
}
 
public void ShowListOfDirectionsFragment() {
    FragmentManager fm = getSupportFragmentManager();
 
    Fragment fragment = fm.findFragmentById(R.id.fragmentContainer1);
        fragment = new ListOfDirectionsFragment();
        fm.beginTransaction()
                .replace(R.id.fragmentContainer1, fragment)
                .commit();
 
 
}
}
Фрагмент

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
public class MainMenuFragment extends android.support.v4.app.Fragment implements MainMenuAdapter.Listener {
 
public RecyclerView mRecyclerView;
public MainMenuAdapter menuAdapter;
 
 
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
    View v = inflater.inflate(R.layout.fragment_main_menu_fragment, container, false);
 
    mRecyclerView = (RecyclerView) v.findViewById(R.id.main_menu_fragment);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mRecyclerView.setLayoutManager(new GridLayoutManager(this.getContext(), 2));
    }
 
    OptionElementList optionElementList = new OptionElementList(getActivity());
    List<OptionElement> optionElement = optionElementList.getOptionElement();
 
    menuAdapter = new MainMenuAdapter(optionElement, this);
    mRecyclerView.setAdapter(menuAdapter);
 
    return v;
}
 
@Override
public void itemClick(int position) {
    if (position == 1) {
        MainActivity currentActivity = (MainActivity) getActivity();
        currentActivity.ShowListOfDirectionsFragment();
    }
}
 
 
public class OptionElement {
    String title;
 
    OptionElement(String title) {
        this.title = title;
    }
 
    public String getTitle() {
        return title;
    }
 
}
 
public class OptionElementList {
 
    private List<OptionElement> mOptionElements;
 
    private OptionElementList(Context context) {
        mOptionElements = new ArrayList<>();
    }
 
    public List<OptionElement> getOptionElement() {
 
        for (int i = 0; i < 100; i++) {
 
            mOptionElements.add(new OptionElement("1"));
            mOptionElements.add(new OptionElement("2"));
            mOptionElements.add(new OptionElement("3"));
            mOptionElements.add(new OptionElement("4"));
            mOptionElements.add(new OptionElement("5"));
            mOptionElements.add(new OptionElement("6"));
 
        }
 
        return mOptionElements;
    }
 
}
}
Адаптер

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
public class MainMenuAdapter extends RecyclerView.Adapter<MainMenuAdapter.MainMenuHolder> {
 
interface Listener {
     void itemClick(int position);
}
Listener listener;  
List<MainMenuFragment.OptionElement> mOptionElement;
 
public MainMenuAdapter(List<MainMenuFragment.OptionElement> optionElements, Listener listener) {
    this.listener=listener; 
    mOptionElement = optionElements;
}
 
 
public class MainMenuHolder extends RecyclerView.ViewHolder {
 
    TextView TitleOfMenuPoint;
    MainMenuFragment.OptionElement mOptionElement;
 
    public MainMenuHolder(View itemView) {
        super(itemView);
 
        TitleOfMenuPoint = (TextView) itemView.findViewById(R.id.title_of_main_menu_point);
 
        itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
 
                listener.itemClick(getLayoutPosition());
            }
        });
    }
}
 
 
public MainMenuHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    View view = layoutInflater.inflate(R.layout.menu_point, parent, false);
 
    GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
    params.height = 350;
    params.width = 350;
    params.getSpanSize();
 
    view.setLayoutParams(params);
 
 
    return new MainMenuHolder(view);
}
 
public void onBindViewHolder(MainMenuHolder menuHolder, int position) {
    menuHolder.TitleOfMenuPoint.setText((mOptionElement.get(position)).getTitle());
 
    Log.d("Testing", "Checkpoint 1");
}
 
public int getItemCount() {
 
    return mOptionElement == null ? 0 : mOptionElement.size();
}
}
Я так понимаю, активити никак не может ассоциироваться с фрагментом...
0
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
05.10.2018, 05:42
В активити в showMenuFragment нужно если null вызывать add вместо replace. А если не null то вот уже replace
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
05.10.2018, 23:48  [ТС]
VASSUV, попробовал, не помогает....
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
07.10.2018, 17:36  [ТС]
Выкладываю работающий код
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
public class MainActivity extends AppCompatActivity implements MainMenuFragment.OnFragmentDataListener{
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ShowMenuFragment();
 
    }
 
    public void ShowMenuFragment() {
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer1);
        if (fragment == null) {
            fragment = new MainMenuFragment();
            fm.beginTransaction()
                    .add(R.id.fragmentContainer1, fragment)
                    .commit();
 
        }
    }
    
 
    @Override
    public void onFragmentDataListener() {
        FragmentManager fm = getSupportFragmentManager();
 
        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer1);
        fragment = new ListOfDirectionsFragment();
        fm.beginTransaction()
                .replace(R.id.fragmentContainer1, fragment)
                .commit();
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bignerdranch.android.abiturientsziu.MainActivity">
 
    <LinearLayout
        android:id="@+id/fragmentContainer1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
 
    </LinearLayout>
 
</android.support.constraint.ConstraintLayout>
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
public class MainMenuFragment extends android.support.v4.app.Fragment implements MainMenuAdapter.Listener {
 
    public RecyclerView mRecyclerView;
    public MainMenuAdapter menuAdapter;
    MainActivity currentActivity = (MainActivity) getActivity();
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        View v = inflater.inflate(R.layout.fragment_main_menu_fragment, container, false);
 
        mRecyclerView = (RecyclerView) v.findViewById(R.id.main_menu_fragment);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            mRecyclerView.setLayoutManager(new GridLayoutManager(this.getContext(), 2));
        }
 
        OptionElementList optionElementList = new OptionElementList(getActivity());
        List<OptionElement> optionElement = optionElementList.getOptionElement();
 
        menuAdapter = new MainMenuAdapter(optionElement, this);
        mRecyclerView.setAdapter(menuAdapter);
 
        return v;
    }
 
    public interface OnFragmentDataListener {
        void onFragmentDataListener();
    }
 
    public OnFragmentDataListener mListener;
 
    @Override
    public void itemClick(int position) {
        if (position == 1) {
            mListener.onFragmentDataListener();
            // currentActivity.ShowListOfDirectionsFragment();
        }
    }
 
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentDataListener) {
            mListener = (OnFragmentDataListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragment1DataListener");
        }
    }
 
 
 
 
    public class OptionElement {
        String title;
 
        OptionElement(String title) {
            this.title = title;
        }
 
        public String getTitle() {
            return title;
        }
 
    }
 
    public class OptionElementList {
 
        private List<OptionElement> mOptionElements;
 
        private OptionElementList(Context context) {
            mOptionElements = new ArrayList<>();
        }
 
        public List<OptionElement> getOptionElement() {
 
            for (int i = 0; i < 100; i++) {
 
                mOptionElements.add(new OptionElement("Календарь абитуриента"));
                mOptionElements.add(new OptionElement("Направления подготовки"));
                mOptionElements.add(new OptionElement("Правила приема"));
                mOptionElements.add(new OptionElement("Расписание экзаменов"));
                mOptionElements.add(new OptionElement("Результаты экзаменов"));
                mOptionElements.add(new OptionElement("Список поступивших"));
 
            }
 
            return mOptionElements;
        }
 
    }
 
}
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
public class MainMenuAdapter extends RecyclerView.Adapter<MainMenuAdapter.MainMenuHolder> {
 
    interface Listener {
         void itemClick(int position);
    }
 
    Listener listener;
    List<MainMenuFragment.OptionElement> mOptionElement;
 
    public MainMenuAdapter(List<MainMenuFragment.OptionElement> optionElements, Listener listener) {
        mOptionElement = optionElements;
        this.listener = listener;
    }
 
 
    public class MainMenuHolder extends RecyclerView.ViewHolder {
 
        TextView TitleOfMenuPoint;
        MainMenuFragment.OptionElement mOptionElement;
 
        public MainMenuHolder(View itemView) {
            super(itemView);
 
            TitleOfMenuPoint = (TextView) itemView.findViewById(R.id.title_of_main_menu_point);
 
            itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    listener.itemClick(getLayoutPosition());
                }
            });
        }
    }
 
 
    public MainMenuHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.menu_point, parent, false);
 
        GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
        params.height = 350;
        params.width = 350;
        params.getSpanSize();
 
        view.setLayoutParams(params);
 
 
        return new MainMenuHolder(view);
    }
 
    public void onBindViewHolder(MainMenuHolder menuHolder, int position) {
        menuHolder.TitleOfMenuPoint.setText((mOptionElement.get(position)).getTitle());
 
        Log.d("Testing", "Checkpoint 1");
    }
 
    public int getItemCount() {
 
        return mOptionElement == null ? 0 : mOptionElement.size();
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<FrameLayout 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"
    >
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/main_menu_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment"
        android:paddingTop="40dp"
        android:paddingBottom="50dp"
        android:paddingLeft="40dp"
        />
 
</FrameLayout>
Теперь работает.
В новом решении я реализовал взаимодействие фрагмента и активити (в части перехода во второй фрагмент) через интерфейс.
Правда, при этом пришлось использовать onAttach - знаю, что его не рекомендуют использовать. Буду признателен, если подскажете, что можно использовать вместо него.
Всем спасибо
0
MiThEoN
 Аватар для VASSUV
466 / 323 / 42
Регистрация: 31.10.2009
Сообщений: 546
Записей в блоге: 2
07.10.2018, 17:49
Цитата Сообщение от VASSUV Посмотреть сообщение
Написал псевдокод, но архитектуру показал
Зачем вы имплементите интерфейс во фрагмент? Проигрнорировали совет, да?
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 128
07.10.2018, 18:11  [ТС]
VASSUV, ну почему же проигнорировал. Ваш совет как раз стал решающим для написания работающего кода.
Только по части имплементации интерфейса во фрагменте - да, это пока не задействовал.
Если настаиваете, сделаю - не совсем понял, правда, чем плохо имплементировать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2018, 18:11
Помогаю со студенческими работами здесь

Обработка click при нескольких одинаковых элементах
Здравствуйте! Не могу сообразить..как сделать обработку отдельно каждого элемента? Есть три звездочных рейтинга на одной странице: ...

Обработка нажатий клавиш
Добрый день! Решил сделать небольшую обработку нажатий клавиш в приложении, списал один из распространённых примеров, но он не...

StringGrid - обработка нажатий
Как сделать в StringGrid обработку нажатий? Код из интренет не работает

Обработка нажатий на виджет
Подскажите пожалуйста. Из уроков так и не понял. 1 Как сделать чтобы при нажатии на установленный виджет запускалась MainActivity для...

Обработка нажатий клавиш
Есть у меня .net приложение и есть необходимость обрабатывать клавиатуру в чужом окне (thread id и hwnd у меня есть). Сказано - сделано,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru