ListView (items - TextView, EditText, CheckBox) + ArrayAdapt

Интерфейс, диалоги, темы, стили, меню
Ответить
kym
Сообщения: 9
Зарегистрирован: 26 мар 2014, 07:12

ListView (items - TextView, EditText, CheckBox) + ArrayAdapt

Сообщение kym » 26 мар 2014, 07:28

Добрый день.
Есть проблема с ListView.
Подробнее:
- есть drugsList = new ArrayList<DataForDrugList>(); В котором DataForDrugList = public String drug = ""; public int count = 0; public Boolean isM = false;
- есть layout для строк в ListView, в этом layout соответственно есть три элемента TextView, EditText, CheckBox;
- есть ArrayAdapter

Код: Выделить всё

private class MyArrayAdapter extends ArrayAdapter<DataForDrugList> {

		private class VHolder {
			private TextView drug;
			private EditText count;
			private CheckBox isM;
		}

		public MyArrayAdapter(List<DataForDrugList> list) {
			super(mContext, R.layout.lv_item, R.id.drugNameTV, list);
		}

		public View getView(final int position, final View convertView,	final ViewGroup parent) {
			final View v = super.getView(position, convertView, parent);
			if (v != convertView && v != null) {
				final VHolder holder = new VHolder();
				holder.drug = (TextView) v.findViewById(R.id.drugNameTV);
				holder.count = (EditText) v.findViewById(R.id.drugCountET);
				holder.count.addTextChangedListener(new TextWatcher() {
					@Override
					public void afterTextChanged(Editable s) {
						// TODO Auto-generated method stub
						if (!s.toString().isEmpty() && !s.toString().equals("0")) {
							drugsList.get(position).count = Integer.parseInt(s.toString());
							getItem(position).count = Integer.parseInt(s.toString());
						}
					}

					@Override
					public void beforeTextChanged(CharSequence s,
							int start, int count, int after) {
						// TODO Auto-generated method stub

					}

					@Override
					public void onTextChanged(CharSequence s, int start, int before, int count) {
						// TODO Auto-generated method stub
					}

				});
				holder.isMerchant = (CheckBox) v.findViewById(R.id.drugBooleanCB);
				holder.isMerchant.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
						// TODO Auto-generated method stub
						drugsList.get(position).isMerchant = isChecked;
						getItem(position).isMerchant = isChecked;
					}
				});
				v.setTag(holder);
			} 
			
	        VHolder holder = (VHolder) v.getTag();
				
			String _name = getItem(position).drug;
			int _count = getItem(position).count;
			Boolean _isM = getItem(position).isM;
			
			
			holder.drug.setText(_name);
			holder.count.setText(String.valueOf(_count));
			if (_isM)
				holder.isM.setChecked(true);
			else
				holder.isM.setChecked(false);
			
			if (modeEditable) {
				holder.count.setEnabled(true);
				holder.isMerchant.setClickable(true);
			} else {
				holder.count.setEnabled(false);
				holder.isMerchant.setClickable(false);
			}
			
			return v;
		}
	}
- ну и соответственно есть такие две строчки в которых к ListView цепляется адаптер:

Код: Выделить всё

MyArrayAdapter adapter = new MyArrayAdapter(drugsList);
drugsLV.setAdapter(adapter);
Логика всего этого дела следующая - есть два режима показа управляемых modeEditable. В одном случае только просмотр, в другом случае можно редактировать поля с количеством и менять состояние чекбоксов.
Просмотр работает нормально, всё отображается правильно, здесь вопросов нет.

Проблема в режиме редактирования, а именно - у меня в списке в среднем порядка 20 записей, на экран они не влазят, список надо прокручивать чтобы добрать до нижних записей. Проблема возникает тогда, когда осуществляется прокрутка списка - если в первой строке отметить чекбокс и прокрутить список до самого низа, а потом прокрутить вверх, то отмеченная галка оказывается скинутой. Если отметить чекбоксы в нескольких различных верхних строках и прокрутить список, то в нижней и средней части появятся отмеченными случайные строки, верхние частично скинутся, частично останутся.

Может кто нибудь дать ссылку на туториал или подсказать в чём проблема?

siberprogs
Сообщения: 93
Зарегистрирован: 05 мар 2014, 06:20

Re: ListView (items - TextView, EditText, CheckBox) + ArrayA

Сообщение siberprogs » 26 мар 2014, 07:37

Вот в этом уроке описано, правда без holder:http://startandroid.ru/ru/uroki/vse-uro ... apter.html
Linux Fedora RFRemix + Intellij Idea

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: ListView (items - TextView, EditText, CheckBox) + ArrayA

Сообщение Foenix » 26 мар 2014, 11:12

извини, но дык при нажатии на чек-бокс его состояние записывать надо в твой массив, а иначе толку от нажатий?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kym
Сообщения: 9
Зарегистрирован: 26 мар 2014, 07:12

Re: ListView (items - TextView, EditText, CheckBox) + ArrayA

Сообщение kym » 26 мар 2014, 12:14

Спасибо большое, посмотрел как сделано по ссылке, всё дело по ходу в том, что по ссылке при изменении статуса

Код: Выделить всё

getProduct((Integer) buttonView.getTag()).box = isChecked;
а именно дело по ходу в getTag().

Пока делал другой список, в нём сделал аналогично уроку, всё работает.

Ответить