@Dmytto

Как сделать так, чтобы по нажатию на итем в ListView открывался диалог с нужной мне информацией?

Всем доброго времени суток!

Будучи совсем зеленым в Android разработке я столкнулся с проблемой, решение которой не смог найти в интернете (Если у вас всё же есть ссылка или готовое решение, буду благодарен.).

Есть строковый массив с наименованием кофейных напитков, который передается в ListView.
По нажатию на элемент открывается AlertDialog, и в нем я хочу передать состав этих напитков.
Вот код:

spoiler
public class MainActivity extends AppCompatActivity {

    final Context context = this;
    ListView listView;

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

        listView = (ListView) findViewById(R.id.listView);//листвью

        final String[] values = new String[]
                {"Americano", "Cappuccino", "Latte"};//строковый массив

        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);//создаю адаптер, переменная values содержит название напитков

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//обработчик нажатия на элемент в листвью
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int itemPosition = position;
                String itemValue = (String) listView.getItemAtPosition(position);
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);


                alertDialogBuilder.setTitle("Message:");
                alertDialogBuilder.setMessage( "Название напитка:\n" + itemValue);//здесь должен показываться состав вроде молоко, объем и т.д.
                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.show();//вывожу диалог на экран
            }
        });
    }
}
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Короче начни с того, что выкинь ListView. Забудь о нём, как будто его не существует. Он учит плохому, все эти ArrayAdapter'ы - зло, за ними не видно, как надо делать правильно.
Возьми RecyclerView. Он покажется тебе сложнее, но он заставит тебя делать правильнее.
Уйди от списка строк. Список строк это ничто, нет у строки "эспрессо" никакого состава. У тебя должна быть моделька, POJO, в котором хранятся твои данные для одного элемента списка. В твоём случае это одна строчка? Прекрасно, это будет класс с одним полем. Дальше ты в этот же класс добавишь ещё одно поле - айди(id) этого элемента. По айди ты должен уметь однозначно получать и имя, и список ингридиентов.
Дальше, когда ты напишешь кастомный адаптер к RecyclerView, тебе нужно будет проставить onClickListener на вьюхи. нажатия этого листенера ты должен прокинуть в свой интерфейс
interface CoffeeSelectionListener {
    void onCoffeeSelected(int coffeeId);
}

Этот интерфейс-листенер должен приходить в твой адаптер снаружи, таким образом ты абстрагируешься от конкретного действия. И это хорошо.
Снаружи проставь листенер, и по айдишнику находи список ингридиентов. Дальше показывай его.
Упаси бог тебя показывать в AlertDialog'e. Возьми DialogFragment, потрать время, но сделай нормально. Никто уже не пользуется диалогами.

Когда ты это сделаешь у тебя получится чуть-чуть лучшего качества код. Дальше надо будет абстрагироваться ещё.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Beshere
@Beshere
Инженер-программист
Ну, если по быстрому: в Java есть такая структура данных Map - хранит списки в виде ключ, значение.

Например:
(Американо)(Кофе, Вода)
(Капучино)(Кофе, Молоко)

Создайте такой словарик. Когда пользователь кликнет капучино, методом get("капучино") у этой мапы вытяните список ингредиентов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
АКМЭ сервис Санкт-Петербург
от 80 000 до 110 000 руб.
iGooods.ru Санкт-Петербург
от 150 000 руб.
Frogogo Москва
от 120 000 руб.