Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
AIN427
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 5
#1

Реализация PopupMenu в элементе CardView - Android

29.06.2016, 14:36. Просмотров 264. Ответов 2
Метки нет (Все метки)

Всем привет! Нужна помощь в реализации одного момента.
Есть CardView, и в каждом элементе выпадающее меню (типа контекстного) с возможностью удаления и редактирования.
Решил реализовывать с помощью PopupMenu. Написал дао слой, методы CRUD, добавил ImageButton к CardView и к нему прикрутил метод onClick, который это самое выпадающее меню вызывает. Ну и обработчик нажатия на пункты меню. Вот тут и возникла проблема.

Вот обработчик пунктов этого меню:

Java
1
2
3
4
5
6
7
8
9
10
11
12
switch (item.getItemId()) {
                    case R.id.deleteCardViewItem:
                        DBHelper dbHelper = new DBHelper(MainActivity.this);//экземпляр класса, где реализованы CRUD методы.
                        Reminder reminder = dbHelper.getReminder(?); //Экземпляр сущности в БДшке. 
                        dbHelper.deleteReminder(reminder); //Собственно, сам метод удаления сущности. 
                        return true;
                    case R.id.updateCardViewItem:
                         //тут апдейт. ещё не реализовывал
                        return true;
                }
                return false;
            }
Там где знак вопроса (getReminder(?)) нужно передать конкретную сущность из БД, которая привязана к конкретному элементу CardView, но сложность в том, что я не понимаю, как это реализовать. Откуда брать эту сущность? Возможно, я не правильно написал реализацию создания CardView элементов? При необходимости дам и этот код.

Вот это и есть основной вопрос.
Ну, и что бы не плодить кучу тем, заодно ещё поинтересуюсь, как лучше реализовать обновление активити. Тут вот в чем суть:
При нажатии на кнопку "добавить" вылазит диалоговое окно в которое вводятся данные. Записываются в БДшку, но на экране не появляются. Моё активити создалось при запуске приложения, добавление нового элемента я делал после этого, и если экран перевернуть, то активити пересоздается и все добавленные записи появляются. Можно, конечно, в обработчике диалогового окна прописать, что бы активность пересоздавалась после каждого добавления, но мне кажется, что это не совсем правильно, и существует вариант получше.

Ну и, было бы не плохо, если бы кто-то взялся меня немного поменторить, поглядел на код, указал на ошибки, подсказал бы как лучше и иногда поотвечал на мои вопросы. Обещаю не дергать по пустякам, сначала гуглить, самому решать проблему и только в крайнем случае, когда уже не знаю что делать, задавать вопрос. Было бы не плохо иметь такую возможность. Хотя бы раз в какой-то период. Можно договорится, как будет удобно. Был бы ОЧЕНЬ благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2016, 14:36     Реализация PopupMenu в элементе CardView
Посмотрите здесь:

Рисование в элементе view Android
Android PopupMenu и KeyEvent.KEYCODE_MENU
Android TextView в элементе ListView
CardView и серая линия :)? Android
Recycle/CardView NullPointerException Android
CardView Android
MapView в CardView RecyclerAdapter Android
Android Обрезается bottom border у CardView на LinearLayout
Android Клик по кнопке в элементе listView
Android OnTouch на элементе меню
Android Выравнять текст в CardView
Android Нажатие на CardView

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
urayatsko
15 / 15 / 8
Регистрация: 08.04.2015
Сообщений: 36
30.06.2016, 10:45     Реализация PopupMenu в элементе CardView #2
Здравствуйте, если есть cardView есть и список - RecycleVIew. Нажатье на елемент(view) cardview можна сделать в адаптере там вы получите и сам объект.
После добавление записи, у адаптера вызывать метод notifydatasetchanged
AIN427
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 5
01.07.2016, 13:16  [ТС]     Реализация PopupMenu в элементе CardView #3
Цитата Сообщение от urayatsko Посмотреть сообщение
Здравствуйте, если есть cardView есть и список - RecycleVIew. Нажатье на елемент(view) cardview можна сделать в адаптере там вы получите и сам объект.
После добавление записи, у адаптера вызывать метод notifydatasetchanged
Здравствуйте, спасибо за ответ.
Но я так и не понял, как решить проблему...

Вот мой адаптер:

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 RemindListAdapter extends RecyclerView.Adapter<RemindListAdapter.RemindViewHolder> {
 
    private ArrayList<Reminder> reminder;
 
    public RemindListAdapter(ArrayList<Reminder> reminder) {
        this.reminder = reminder;
    }
 
    @Override
    public RemindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.remind_item, parent, false);
        return new RemindViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(RemindViewHolder holder, int position) {
        holder.title.setText(reminder.get(position).getTitle());
        holder.description.setText(reminder.get(position).getDescription());
    }
 
    @Override
    public int getItemCount() {
        return reminder.size();
    }
 
    public static class RemindViewHolder extends RecyclerView.ViewHolder {
 
        CardView cardView;
        TextView title;
        TextView description;
 
 
        public RemindViewHolder(View itemView) {
            super(itemView);
 
            cardView = (CardView) itemView.findViewById(R.id.cardView);
            title = (TextView) itemView.findViewById(R.id.item_title);
            description = (TextView) itemView.findViewById(R.id.item_description);
        }
    }
 
 
 
}

Здесь я создаю и наполняю содержимым RecyclerView:

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
public class HistoryFragment extends AbstractTabFragment {
    private static final int LAYOUT = R.layout.fragment_history;
 
 
    public static HistoryFragment getInstance(Context context) {
        Bundle args = new Bundle();
        HistoryFragment fragment = new HistoryFragment();
        fragment.setArguments(args);
 
        fragment.setContext(context);
        fragment.setTitle(context.getString(R.string.tab_item_history));
        
 
        return fragment;
    }
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(LAYOUT, container, false);
 
        RecyclerView rv = (RecyclerView) view.findViewById(R.id.recycleView);
        rv.setLayoutManager(new LinearLayoutManager(context));
        RemindListAdapter adapter = new RemindListAdapter(createHistoryList());
        adapter.notifyDataSetChanged();
        rv.setAdapter(adapter);
        return view;
    }
 
    private ArrayList<Reminder> createHistoryList() {
 
        DBHelper dbHelper = new DBHelper(getContext());
 
        return dbHelper.getAllReminders();
    }
 
    public void setContext(Context context) {
        this.context = context;
    }
 
}
добавление нового содержимого находится вообще в другом классе:

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
public class InputDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
 
    private View form = null;
 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        form = getActivity().getLayoutInflater().inflate(R.layout.input_dialog, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        return (builder.setTitle("Форма ввода").setView(form)
                .setPositiveButton(R.string.add_button, this)
                .setNegativeButton(R.string.cancel_button, null).create());
    }
 
    @Override
    public void onClick(DialogInterface dialog, int which) {
        EditText titleBox = (EditText) form.findViewById(R.id.inputTitle);
        EditText descriptionBox = (EditText) form.findViewById(R.id.inputBody);
 
        Reminder reminder = new Reminder(titleBox.getText().toString(), descriptionBox.getText().toString());
        DBHelper dbHelper = new DBHelper(getContext());
        dbHelper.addReminder(reminder);
 
 
 
    }
 
    @Override
    public void onDismiss(DialogInterface unused) {
        super.onDismiss(unused);
    }
 
    @Override
    public void onCancel(DialogInterface unused) {
        super.onCancel(unused);
    }
 
 
}
Обработчик popupMenu находится вообще в MainActivity.

В InputDialogFragment (там где происходит добавление) я не могу вызвать метод notifydatasetchanged, т.к. там нет самого адаптера.

Обратится к сущности через адаптер из MainActivity (там где реализация обработчика PopupMenu) тоже.

В общем, реализация, я так понимаю, у меня сделана через одно место. Всё раскидано по разным местам. Теперь вопрос, как это все красиво переделать...
Yandex
Объявления
01.07.2016, 13:16     Реализация PopupMenu в элементе CardView
Ответ Создать тему
Опции темы

Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru