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

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

Войти
Регистрация
Восстановить пароль
 
 
umbrto
2 / 2 / 0
Регистрация: 04.02.2014
Сообщений: 71
#1

Список с двумя полями - Программирование Android

02.12.2015, 05:15. Просмотров 698. Ответов 25
Метки нет (Все метки)

Доброго времени суток!
Мне необходимо создать список, который содержит название спорт секции(например) и поле стоимость, которую вводит пользователь.
Я умею создавать только простой список через ArrayAdapter, которому в параметрах передается массив, содержащий элементы списка.
А вот как создать список с двумя полями, при чем одно из них сделать так, что бы пользователь сам вводил значение?
Была догадка сделать это с помощью создания класса, в котором 2 поля: название и стоимость. После чего с помощью ArrayList преобразовать это в массив объектов и построить из него список.
Но тут же возникает ошибка в том, что поле "стоимость" прописное,а не вводимое с клавиатуры.
Надеюсь на вашу помощь.

Не по теме:

Я не прошу вас писать за меня код программы, я САМ хочу ее написать, просто необходимо с кем то консультироваться. Благодарю за понимание.



Добавлено через 14 минут
Также я знаю как создать поле в которое вводиться значение, но как его тогда связать с моим списком? Что бы каждой секции соответствовала определенная стоимость
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2015, 05:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Список с двумя полями (Программирование Android):

Singleton или класс с полями static? - Программирование Android
Собственно вопрос в названии темы. Задача в следующем, пишу приложение, и мне нужно некоторое количство глобальных переменных носящих...

JSOUP POST. В ответ вместо JSon приходит разметка страницы с полями для ввода данных - Программирование Android
Делаю пост запрос к апи сайта. Назад должен получить json, однако получаю разметку страницы с полями для ввода данных. Т.е. как будто...

Определите новый класс Student с двумя закрытыми полями полями: name и sumb - C#
Я очередной студент, которые вам, полагаю, очень надоели, но все же я очень надеюсь на вашу помощь. Задание 4. Массивы Объектов. ...

Определить класс Student с двумя закрытыми полями полями: name и sumb - C#
Всем доброго дня. Помогите пожалуйста довести код до ума. Я что то никак не разберусь. Вот задание: 1. Создайте новое консольное...

Класс с двумя полями - C++
подскажите class classrod { protected: float a; public: classrod():a(0){} // конструктор...

Создать класс с двумя полями и конструктором - C++
Напишите пожалуйста класс содержащий два поля: фирма машины(строка), цена(число); конструктор и методы ввода/вывода. Мой зачет в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Василевский
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 102
02.12.2015, 07:16 #2
т.е стоимость везде одна ? или есть массив цен ?
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
02.12.2015, 09:44 #3
Пишите свой адаптер. http://startandroid.ru/ru/uroki/vse-...j-adapter.html
umbrto
2 / 2 / 0
Регистрация: 04.02.2014
Сообщений: 71
02.12.2015, 22:26  [ТС] #4
не то что бы массив
цены может рандомно задавать пользователь

Добавлено через 20 секунд
спасибо за урок
посмотрю

Добавлено через 18 минут
посмотрел урок
познавательно, но опят же цена задана
а мне ее надо вводить с клавиатуры
я бы не писал сюда не рассмотрев все варианты
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
02.12.2015, 22:41 #5
umbrto, делаешь 2 экрана. Один список нажимая на пункт которого попадаешь на второй экран для заполнения выбранного пункта.
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
02.12.2015, 23:56 #6
Mikalai, Так не интересно, человек же должен немного думать))
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
03.12.2015, 07:32 #7
гы... ну давайте, человеки, придумайте теперь ОДИН экран и скролируемый список в полем ввода во второй колонке.
:-)
и не забудьте синхронизацию с сервером для введенных данных.

задачу не знаю, читаю с любопытством. может топикстартер расскажет полнее - тогда может чего будет в совет.
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
03.12.2015, 14:22 #8
Цитата Сообщение от bastrakov Посмотреть сообщение
гы... ну давайте, человеки, придумайте теперь ОДИН экран и скролируемый список в полем ввода во второй колонке
не уверен что я правильно понял вызов, но вот
активити по минимуму, там же класс-модель для секции (имя, цена) и интерфейс...можно оставить так, а можно по разным файлам раскидать
Кликните здесь для просмотра всего текста
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
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
 
import java.util.ArrayList;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.sectionRv);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);
        //
        ArrayList<MySection> list = new ArrayList<>(); // создаем список секций
        fillArrayWithRandomPrices(list); // заполняем его ценами и названиями, метод заглушка
        recyclerView.setAdapter(new MyAdapter(list)); // создаем наш адаптер и назначаем его на RecyclerView
    }
 
    private void fillArrayWithRandomPrices(ArrayList<MySection> list) {
        for (int i = 0; i < 25; i++) {
            MySection section = new MySection("Название секции " + i);
            section.setPrice(i * 100);
            list.add(section);
        }
    }
 
}
 
class MySection {
    private String sectionName;
    private int price;
 
    MySection(String name) {
        sectionName = name;
    }
 
    public int getPrice() {
        return price;
    }
 
    public void setPrice(int price) {
        this.price = price;
    }
 
    public String getSectionName() {
        return sectionName;
    }
 
    public void setSectionName(String value) {
        sectionName = value;
    }
}
 
interface ChangeListener {
    void onEditTextValueChanged(int pos, int price);
}


адаптер с холдером
Кликните здесь для просмотра всего текста
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
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
 
import java.util.ArrayList;
 
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements ChangeListener {
 
    private final ArrayList<MySection> list;
 
    public MyAdapter(ArrayList<MySection> list) {
        this.list = list;
    }
 
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
        return new ViewHolder(v, this);
    }
 
    @Override
    public void onBindViewHolder(ViewHolder holder, int pos) {
        holder.nameTextView.setText(list.get(pos).getSectionName());
        holder.priceEditText.setText(String.valueOf(list.get(pos).getPrice()));
    }
 
    @Override
    public int getItemCount() {
        return list.size();
    }
 
    @Override
    public void onEditTextValueChanged(int pos, int value) {
        list.get(pos).setPrice(value);
    }
 
    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnFocusChangeListener {
        private ChangeListener listener;
        public TextView nameTextView;
        public EditText priceEditText;
 
        public ViewHolder(View v, ChangeListener listener) {
            super(v);
            this.listener = listener;
            nameTextView = (TextView) v.findViewById(R.id.sectionName);
            priceEditText = (EditText) v.findViewById(R.id.sectionPrice);
            priceEditText.setOnFocusChangeListener(this);
        }
 
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            EditText et = (EditText) v;
            int changedPrice = Integer.parseInt(et.getText().toString());
            if (!hasFocus) listener.onEditTextValueChanged(getAdapterPosition(), changedPrice);
        }
    }
}


разметка для активити по минимуму что бы проверить, файл main_activity.xml
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contentPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/sectionRv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
</FrameLayout>

и разметка item-а для RecyclerView файл row.xml
Кликните здесь для просмотра всего текста
XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <EditText
        android:inputType="number"
        android:id="@+id/sectionPrice"
        android:layout_width="100dp"
        android:layout_height="48dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true" />
 
    <TextView
        android:id="@+id/sectionName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/sectionPrice"
        android:layout_toLeftOf="@+id/sectionPrice"
        android:layout_toStartOf="@+id/sectionPrice"/>
 
    <FrameLayout
        android:layout_marginTop="4dp"
        android:layout_marginBottom="4dp"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:background="#21212121"
        android:layout_height="0.5dp"/>
</RelativeLayout>

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

критика приветствуется
umbrto
2 / 2 / 0
Регистрация: 04.02.2014
Сообщений: 71
03.12.2015, 15:06  [ТС] #9
Паблито, спасибо за код, но я хотел просто объяснения реализации данного списка
проверю как Ваш код работает
если возникнут вопросы не могли бы Вы ответить на них?

Добавлено через 1 минуту
Mikalai, в том то и проблема, что мне надо из списка выбрать несколько секций и ввести туда цену
а потом по нажатии на кнопку сохранить все это дело в файлик
только надо, что бы в файл не записывались секции без цены
разбиением на 2 активити я бы сделал)
а вот мне надо через одно
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
03.12.2015, 17:26 #10
2Паблито: если топикстарнер не спасибкнет - я жамкну.
молодец! :-)
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
03.12.2015, 18:06 #11
Паблито, а onFocusChanged() сработает если я закрою приложение кнопкой назад? А если через кнопку home? Если нет то лучше вешать textWatcher. Ну и можно без интерфейса обойтись по идее - прямо в листенере сетить новое значение. И интересно как работает getAdapterPosition() что-то описания не нашел.
MisterMr
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 41
03.12.2015, 18:20 #12
Даешь поиск по темам
ListView с несколькими TextView
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
03.12.2015, 18:39 #13
Если нажать back когда то сначала уедет клавиатура. Следующее нажатие это выход из программы. По условию небыло сказано что надо сохранять данные между запусками программы
А если нажать Home и вернуться то значение в поле остается, а куда ему деваться?
Не совсем понимаю как спасет TextWatcher при нажатии на хоум или бэк?

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

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

Добавлено через 1 минуту
Цитата Сообщение от MisterMr Посмотреть сообщение
Даешь поиск по темам
ListView с несколькими TextView
listview используют только те, кто остал...сильно отстал
уже давно RecyclerView есть

Добавлено через 6 минут
Spelcrawler, да, забыл написать getAdapterPosition() это метод только холдера, не адаптера
и что бы сетить в холдере - туда надо предварительно передать ссылку на наш ArrayList, а сделать это проблематично потому что класс холдера - статический
вобщем ты попробуй сделать это, расскажешь так что бы кода получилось меньше чем у меня с интерфейсом
MisterMr
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 41
03.12.2015, 19:01 #14
И чем же неудобен лист ?)Паблито
Pablito
03.12.2015, 19:06     Список с двумя полями
  #15

Не по теме:

MisterMr, не вижу смысла пересказывать то, что можно легко загуглить самостоятельно

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2015, 19:06
Привет! Вот еще темы с ответами:

Реализовать класс с двумя скрытыми полями first и second - C++
В с++ только начал разбираться, прошу помощи в решении задач. Задание: ООП – Задание № 1 Реализовать класс с двумя скрытыми полями...

Реализовать класс с двумя скрытыми полями first и second - C++
Ребят, помогите решить задачку: (заранее спасибо:)) Сама задачка: Реализовать класс с двумя скрытыми полями first и second. Во классе...

Массив из структур с двумя целочисленными полями - C++
Я попытался написать программу, определяющую массив из структур с двумя полями, содержащими 5 элементов. Ввод значений элементов с консоли....

Структура с двумя полями и одной функцией. Episode 2. - C++
Напишите программу, в которой используется структура с двумя полями и одной функцией. Оба поля имеет тип int. Функция структуры...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.12.2015, 19:06
Ответ Создать тему
Опции темы

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