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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
EVGEN-2208
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 2
#1

Сохранить измененные значения EditText в ListView при прокрутке - Программирование Android

25.11.2013, 11:37. Просмотров 1362. Ответов 2
Метки нет (Все метки)

Добрый день, прошу помощи, т.к. уже долго и безрезультатно пытаюсь решить следующую
задачу:

Есть Листвью с названиями товаров , состоящих из TextView-названий и EditText-весом/шт.
Значение EditText меняется по нажатию на Button "+".
При нажатии на кнопку значение EditText меняется и товар сохраняется "в корзину".

Проблема следующая: при прокрутке все сбивается и значения поля "вес/шт" меняются сами по себе.

Основной класс:
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
public class MainActivity extends Activity {
 
  ArrayList<Product> products = new ArrayList<Product>();
  BoxAdapter boxAdapter;
 
  /** Called when the activity is first created. */
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    // создаем адаптер
    fillData();
    boxAdapter = new BoxAdapter(this, products);
 
    // настраиваем список
    ListView lvMain = (ListView) findViewById(R.id.lvMain);
    lvMain.setAdapter(boxAdapter);
  }
 
  // генерируем данные для адаптера
   
  
  void fillData() {
      products.add(new Product("Помидоры", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("Огурцы", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("Перец", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("Бананы", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("Апельсины", 60, R.drawable.ic_launcher, false,3));
      products.add(new Product("Мандарины б/кост", 60, R.drawable.ic_launcher, false,2));
      products.add(new Product("Яблоки красные", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("Груша конференц", 60, R.drawable.ic_launcher, false,0));
      products.add(new Product("хуярма", 60, R.drawable.ic_launcher, false,0));
      
//   for (int i = 1; i <= 20; i++) {
//     products.add(new Product("Product " + i, i * 1000,
//         R.drawable.ic_launcher, false));
//   }
  }
 
  // выводим информацию о корзине
  public void showResult(View v) {
    String result = "Товары в корзине:";
    for (Product p : boxAdapter.getBox()) {
      if (p.box)
        result += "\n" + p.name+" "+p.ves+" кг";
    }
    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
  }
  
  
}

Адаптер:
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
public class BoxAdapter extends BaseAdapter {
  Context ctx;
  LayoutInflater lInflater;
  ArrayList<Product> objects;
 
  BoxAdapter(Context context, ArrayList<Product> products) {
    ctx = context;
    objects = products;
    lInflater = (LayoutInflater) ctx
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }
 
  // кол-во элементов
  @Override
  public int getCount() {
    return objects.size();
  }
 
  // элемент по позиции
  @Override
  public Object getItem(int position) {
    return objects.get(position);
  }
 
  // id по позиции
  @Override
  public long getItemId(int position) {
    return position;
  }
 
  // пункт списка
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // используем созданные, но не используемые view
    View view = convertView;
    if (view == null) {
      view = lInflater.inflate(R.layout.item, parent, false);
    }
 
    Product p = getProduct(position);
 
    // заполняем View в пункте списка данными из товаров: наименование, цена
    // и картинка
    ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
    ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
    ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
 
 
 
    EditText etves = (EditText) view.findViewById(R.id.tv);
    etves.setText(String.valueOf(p.ves));
    Button btnplus = (Button) view.findViewById(R.id.button1);
    
    etves.setTag(position);
    TextWatcherP inputTextWatcher= new TextWatcherP(etves);
    etves.addTextChangedListener(inputTextWatcher); 
    
    if (p != null) {
            
        btnplus.setTag(etves);
        btnplus.setOnClickListener(
                new OnClickListener() {
            @Override
            public void onClick(View v) {
                float vves;
                
                vves = Float.parseFloat((((EditText)v.getTag()).getText()).toString());
                ++vves;
                ((EditText)v.getTag()).setText(String.valueOf(vves));
                
                
            }
        
    }); 
           
        
        
    }
    
 
    
 
        
    return view;
  }
 
  // товар по позиции
  Product getProduct(int position) {
    return ((Product) getItem(position));
  }
 
  // содержимое корзины
  ArrayList<Product> getBox() {
    ArrayList<Product> box = new ArrayList<Product>();
    for (Product p : objects) {
      // если в корзине
      if (p.ves>0)
          p.box=true;
        box.add(p);
    }
    return box;
  }
 
  
  
  public class TextWatcherP implements TextWatcher {
      public EditText editText;
      public Float vves;
      public TextWatcherP(EditText et){
          super();
          editText = et;
      }
    
      public void afterTextChanged(Editable s) {
          getProduct((Integer) editText.getTag()).ves = vves;
          
      }
      
      public void beforeTextChanged(CharSequence s, int start, int count, int after){
          
      }
      
      public void onTextChanged(CharSequence s, int start, int before, int count) {
          vves=Float.parseFloat(editText.getText().toString());
          
          
      }
};
 
 
}
причем когда "снимаем" значение с эдиттекста до изменения текста, то все сохраняется как надо, но без последнего нажатия.

Java
1
2
3
4
5
6
7
8
9
10
public void afterTextChanged(Editable s) {
          getProduct((Integer) editText.getTag()).ves = vves;
          
      }
 
public void beforeTextChanged(CharSequence s, int start, int count, int after){
          vves=Float.parseFloat(editText.getText().toString());
      }
      
public void onTextChanged(CharSequence s, int start, int before, int count) {
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 11:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сохранить измененные значения EditText в ListView при прокрутке (Программирование Android):

Прокрутка ListView в начало при обновлении EditText - Программирование Android
Всем привет! Проблема следующая - имеется ListView с адаптером. Элементы ListView - кастомные вьюшки с EditText. Если список очень большой,...

Белый фон при прокрутке listview и actionbar в android 2.1 - Программирование Android
При прокрутке ListView на Android 2.3 появляется белый фон. Ставил Cache Color Hint на прозрачный или на цвет фона, не помогает. Как это...

Как сохранить текст с EditText при переходе на другую Activity? - Программирование Android
проблема такая что не могу реализовать EditText сохраняет данные в буфер или еще куда-то при переходе на следующую Acitivity

При прокрутке listview изображения подгружаются, но происходит "скачок" списка - Программирование Android
Здравствуйте. Использую listview и item с текстом и изображениями. При прокрутке listview изображения подгружаются, но происходит...

EditText смещается вниз при вводе текста, который занимает объём больше, чем EditText - Программирование Android
EditText сещается вниз при вводе текста который занимает обём больше чем EditText. Как устранить?

Фильтрация ListView из EditText - Программирование Android
Не могу разобраться с фильтрацией в ListView. Фильтрация происходит правильно (находит нужное количество), но выводит не те, которые нужно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.11.2013, 17:48 #2
в getView нужно выставлять правильные значения.
EVGEN-2208
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 2
26.11.2013, 11:02  [ТС] #3
Не могли бы вы пояснить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 11:02
Привет! Вот еще темы с ответами:

Создание ListView из EditText - Программирование Android
Выдает ошибку в строке при создании адаптера. Пишет, что не распознает конструкцию ArrayAdapter Ниже прилагаю код. Список должен...

EditText.Listener внутри ListView - Программирование Android
Добрый день. Помогите пожалуйста с задачкой. У меня есть ListView, который пополняется записями типа(TextView/EditText), количество...

EditText в одном из Item ListView - Программирование Android
Помогите решить довольно нестандартную задачу. У меня есть ListView, есть Adapter который делает кастомный вид разметки. В ListView...

Живой поиск через один EditText в разных Listview ? - Программирование Android
есть EditText для поиска по спискам в ToolBar MainActivity. при вводе текста в MainActivity вызывается: @Override ...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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